Added ability to show related products

master
Mark Moffat 2020-03-22 15:14:45 +10:30
parent 83064c04a1
commit 5dec4bba02
6 changed files with 82 additions and 7 deletions

View File

@ -249,11 +249,6 @@ Enables/disable the menu setup in `/admin/settings/menu`.
This is the text which will be displayed at the top of your menu. This is the text which will be displayed at the top of your menu.
##### Menu position
You can set position where your menu will be displayed. Setting the value to `side` will position the menu to the left of your products, setting the value to `top`
will create a 'breadcrumb' menu at the top of the page
##### Paypal (Payments) ##### Paypal (Payments)
The Paypal config file is located: `/config/payment/config/paypal.json`. A example Paypal settings file is provided: The Paypal config file is located: `/config/payment/config/paypal.json`. A example Paypal settings file is provided:

View File

@ -40,5 +40,6 @@
"shipping": {}, "shipping": {},
"discount": {} "discount": {}
} }
} },
"showRelatedProducts": true
} }

View File

@ -143,6 +143,10 @@
"shipping": "shipping-basic" "shipping": "shipping-basic"
} }
} }
},
"showRelatedProducts": {
"type": "boolean",
"default": true
} }
}, },
"required": [ "required": [

View File

@ -203,5 +203,7 @@
"Currency ISO": "Currency ISO", "Currency ISO": "Currency ISO",
"Currency used for Blockonomics conversion": "Currency used for Blockonomics conversion", "Currency used for Blockonomics conversion": "Currency used for Blockonomics conversion",
"Logout": "Logout", "Logout": "Logout",
"Company": "Company" "Company": "Company",
"View": "View",
"Related products": "Related products"
} }

View File

@ -337,6 +337,7 @@ router.post('/checkout/removediscountcode', async (req, res) => {
router.get('/product/:id', async (req, res) => { router.get('/product/:id', async (req, res) => {
const db = req.app.db; const db = req.app.db;
const config = req.app.config; const config = req.app.config;
const productsIndex = req.app.productsIndex;
const product = await db.products.findOne({ $or: [{ _id: getId(req.params.id) }, { productPermalink: req.params.id }] }); const product = await db.products.findOne({ $or: [{ _id: getId(req.params.id) }, { productPermalink: req.params.id }] });
if(!product){ if(!product){
@ -358,11 +359,29 @@ router.get('/product/:id', async (req, res) => {
// show the view // show the view
const images = await getImages(product._id, req, res); const images = await getImages(product._id, req, res);
// Related products
let relatedProducts = {};
if(config.showRelatedProducts){
const lunrIdArray = [];
const productTags = product.productTags.split(',');
const productTitleWords = product.productTitle.split(' ');
const searchWords = productTags.concat(productTitleWords);
searchWords.forEach((word) => {
productsIndex.search(word).forEach((id) => {
lunrIdArray.push(getId(id.ref));
});
});
relatedProducts = await db.products.find({
_id: { $in: lunrIdArray, $ne: product._id }
}).limit(4).toArray();
}
res.render(`${config.themeViews}product`, { res.render(`${config.themeViews}product`, {
title: product.productTitle, title: product.productTitle,
result: product, result: product,
productOptions: productOptions, productOptions: productOptions,
images: images, images: images,
relatedProducts,
productDescription: stripHtml(product.productDescription), productDescription: stripHtml(product.productDescription),
metaDescription: config.cartTitle + ' - ' + product.productTitle, metaDescription: config.cartTitle + ' - ' + product.productTitle,
config: config, config: config,

View File

@ -97,5 +97,59 @@
</div> </div>
</div> </div>
</div> </div>
{{#if config.showRelatedProducts}}
{{#if relatedProducts}}
<div class="col-sm-12">
<h4>Related products</h4>
<div class="row">
{{#each relatedProducts}}
<div class="col-md-3">
<div>
{{#if productPermalink}}
<div class="product-wrapper">
<a href="/product/{{this.productPermalink}}">
<div class="vertical-center img-thumbnail">
{{#if productImage}}
<img class="img-fluid" src="{{this.productImage}}" alt="...">
{{else}}
<img class="img-fluid" src="/uploads/placeholder.png" alt="...">
{{/if}}
</div>
<h3 class="product-title product-title-home top-pad-10">
{{this.productTitle}}
</h3>
</a>
</div>
{{else}}
<a href="/product/{{this._id}}">
<div class="vertical-center img-thumbnail">
{{#if productImage}}
<img class="img-fluid" src="{{this.productImage}}" alt="...">
{{else}}
<img class="img-fluid" src="/uploads/placeholder.png" alt="...">
{{/if}}
</div>
<h3 class="product-title product-title-home top-pad-10">
{{this.productTitle}}
</h3>
</a>
{{/if}}
<h3 class="product-price mp-0 text-center">
{{currencySymbol ../config.currencySymbol}}{{formatAmount productPrice}}
</h3>
<p class="text-center">
{{#if productPermalink}}
<a class="btn btn-primary" href="/product/{{this.productPermalink}}">{{ @root.__ "View" }}</a>
{{else}}
<a class="btn btn-primary" href="/product/{{this._id}}">{{ @root.__ "View" }}</a>
{{/if}}
</p>
</div>
</div>
{{/each}}
</div>
</div>
{{/if}}
{{/if}}
</div> </div>
<input type="hidden" id="productId" value="{{result._id}}"> <input type="hidden" id="productId" value="{{result._id}}">