Products
The Products component displays a list of products. The list can be sorted, filtered and paginated.
Properties
category (mixed)
Select only items from this Category. Possible values are:
| Value | Description |
|---|---|
null | Don't filter by category (display everything) |
8 | Only show products from the category with the ID 8 (use any integer) |
:slug | Use the page's :slug URL parameter to find the category to filter by |
filterComponent (string)
Alias of the ProductsFilter component that is used to filter this Products component. Defaults to productsFilter
filter (string)
Use this property to force a filter for this component instance.
The expected value is a encoded query string. You can tweak your filter using the ProductsFilter component and simply copy and paste the query string.
For example, https://mywebsite.com/en/category/bikes?on_sale=true&material=aluminium.carbon&color=dark-grey url give the following filter string:
filter = "on_sale=true&material=aluminium.carbon&color=dark-grey"setPageTitle (bool)
If a category is defined, overwrite the page's title with the category's name. Also set any SEO information stored with the category.
includeChildren (bool)
Include all products or variants from child categories as well.
includeVariants (bool)
Set this to true to list all Variants as single items. Set this to false to list only Products.
perPage (int)
How many items to show per page.
paginate (bool)
Display more than one page.
sort (string)
The sort mode applied to the result set. Possible values are:
| Value | Description |
|---|---|
bestseller | Best selling first |
ratings | Highest rated first |
manual | Order defined via Backend |
latest | Latest products first |
price_low | Lowest price first |
price_high | Highest price first |
oldest | Oldest products first |
random | Sort randomly |
name | Sort by name |
Example implementations
Display all items of a category
[products]
category = ":slug"
setPageTitle = 1
includeVariants = 1
includeChildren = 1
perPage = 9Display the four best selling products
[products]
perPage = 4
paginate = 0
includeVariants = 0
sort = "bestseller"Display the four latest items
[products]
perPage = 4
paginate = 0
includeVariants = 1
sort = "latest"Display eight random products that are currently on sale
[products]
perPage = 8
paginate = 0
includeVariants = 1
sort = "random"
filter = "on_sale=true"Display four random items from the same category of the currently viewed product
title = "Product"
url = "/product/:slug/:variant?"
layout = "default"
is_hidden = 0
[product]
product = ":slug"
variant = ":slug"
[products relatedProducts]
setPageTitle = 0
includeVariants = 1
includeChildren = 0
perPage = 4
paginate = 0
sort = "random"
==
<?php
use Winter\Mall\Models\Category;
function onStart() {
// Fetch the category from the product component.
$productComponent = $this->findComponentByName('product');
$item = optional($productComponent)->item;
if (!$item) {
return;
}
$category = optional($item->categories)->first();
if (!$category) {
return;
}
// If a category is available, use it for the products component.
$this->findComponentByName('relatedProducts')->category = $category;
}
?>
==
{% component 'product' %}
<h2>Other products from this category</h2>
{% component 'relatedProducts' %}Add a add to cart button on the category page
Add the following a tag to your item partial /plugins/winter/components/products/item.htm
<div class="mall-products-item">
<!-- Add this -->
<a class="mall-products-item__cart-button"
href="javascript:;"
data-request="{{ __SELF__ }}::onAddToCart"
data-request-success="data.added && $.publish('mall.cart.productAdded', data)"
data-request-data="product: '{{ item.productHashId }}', variant: '{{ item.variantHashId }}'"
data-request-flash
>
Add to cart
</a>
<!-- /Add this -->
<a href="{{ productPage|page({slug: item.slug, variant: item.variantId}) }}">
<!-- Thumb, Title, etc. -->
</a>
</div>