Shop - Searching and listing products
Introduction
When you enable the shop plugin’s error method it calls the shop.lib.php / error()
. This method is responsible for parsing requests and finding the proper pages based on friendly urls.
Keep in mind that before the error method is triggered, OFW will look for WordPress content (if WP plugin is enabled) and any applicable controller methods (for example any methods in default.ctl.php). Only if nothing is found will we continue on to the __error()
method which triggers shop.lib.php / error()
.
While processing the error method, the shop library will go in this order:
- Look for category It will try to find a
Category
by its friendly url. You can set the{{#url_category#}}
language variable as well (inshop.en_US.lang.ini
), see below for details. - Look for a specific product It will try to find a specific
Product
by its friendly url. You can set the{{#url_product#}}
language variable as well (inshop.en_US.lang.ini
), see below for details. - Search for products It will try to find a list of
Product
objects using free-text search. You can set the{{#url_search#}}
language variable as well (inshop.en_US.lang.ini
), see below for details. - Display 404 Actually, the error() method will just return false, but typically your default.ctl.php’s __error() method will follow up with a 404 page at this point.
Category page
The category page lists all products within a specific Category
. Requests are handled by shop/category.ctl.php
.
Configuration options
You can set up {{#url_category#}}
(shop.en_US.lang.ini
) in which case the category page will only work for urls that match. So, if you set url_category = category
then only http://example.com/category/my-friendly-url/
will display the category page.
Query options
You can filter and sort the results via the URL query string. Here’s a list of options:
view
– displays a ‘list’ or ‘grid’ view where it either loadsshop/category_grid.html
orshop/category.html
. the default is ‘list’ but this default can be modified with thedefault_list_view
configuration option.property
– this can be a single or multipleProductProperty
id(s), which will filter the list down to the products which have that property/properties. Useproperty[]
for the input’s name or in the url if you want to filter to multiple properties.featured
– if set to any value it will display only featured products.sort
– value can be ‘name’, ‘price’ or ‘time’ and determines how the products are sorted.sortdir
– value can be ‘ASC’ or ‘DESC’ and determines thesort
order.perpage
– the number of items displayed per page. Defaults to 10 but this can be changed with thedefault_items_per_page
configuration option.minprice
– the minimum product pricemaxprice
– the maximum product price
Templates and variables
Depending on the view
option, category lists have two templates: shop/category_grid.html
or shop/category.html
. Copy them to your local /app/view/
folder to customize it.
In your template, you have access to these variables:
{{category}}
– the currently selectedCategory
{{products}}
– a list ofProduct
objects found in the currentCategory
{{productproperties}}
– a list ofProductProperty
objects found in the currentCategory
{{current_property}}
– the currently selectedProductProperty
, if any{{current_properties}}
– the currently selectedProductProperties
, if multiple properties were defined.
Product page
The product page displays a specific product. Requests are handled by shop/product.ctl.php
.
Configuration options
You can set up {{#url_product#}}
(shop.en_US.lang.ini
) in which case the product page will only work for urls that match. So, if you set url_product = products
then only http://example.com/products/my-friendly-url/
will display the product page.
Templates and variables
In your template /shop/product.html
, you have access to these variables:
{{product}}
– the currently selectedProduct
object{{admin_preview}}
– this will be true when the admin is previewing the product page; implementing this is optional
Search page
The search results page lists all products that result from a search query. Requests are handled by shop/product.ctl.php / search()
.
Configuration options
You can set up {{#url_search#}}
(shop.en_US.lang.ini
) in which case the search page will only work for urls that match. So, if you set url_category = find
then only http://example.com/find/?query=my%20search%20query
will display the search results page.
Query options
You can filter and sort the results via the URL GET query string. Here’s a list of options:
query
– the search query as sent by the user. if you want to display it on the page you can use{{zaj.get.query|escape}}
to show what the user searched for.view
– displays a ‘list’ or ‘grid’ view where it either loadsshop/search_grid.html
orshop/search.html
. the default is ‘list’ but this default can be modified with thedefault_list_view
configuration option.property
– this can be a single or multipleProductProperty
id(s), which will filter the list down to the products which have that property/properties. Useproperty[]
for the input’s name or in the url if you want to filter to multiple properties.featured
– if set to any value it will display only featured products.sort
– value can be ‘name’, ‘price’ or ‘time’ and determines how the products are sorted.sortdir
– value can be ‘ASC’ or ‘DESC’ and determines thesort
order.perpage
– the number of items displayed per page. Defaults to 10 but this can be changed with thedefault_items_per_page
configuration option.minprice
– the minimum product pricemaxprice
– the maximum product price
Templates and variables
Depending on the view
option, category lists have two templates: shop/search_grid.html
or shop/search.html
. Copy them to your local /app/view/
folder to customize them.
In your template, you have access to these variables:
{{products}}
– a list ofProduct
objects that match the current search query{{productproperties}}
– a list ofProductProperty
objects found in any of theProduct
objects that match the current search query (this is different from the category page!){{current_property}}
– the currently selectedProductProperty
, if any{{current_properties}}
– the currently selectedProductProperties
, if multiple properties were defined.
Get all available products
Use Product::fetch_by_shop()
to get a list of products for the current shop. If you want items for a specific shop, you can pass that as a parameter Product::fetch_by_shop($shop)
.
Get last visited products
Visited products are saved into database with the actual order id (since each visitor gets their own order id).
The list of last visited products is available through the Product::fetch_last_visited()
. You can optionally pass an $order object if you do not want to fetch last visited for the current user (current order id).
The list of last visits is available in ProductVisit::fetch_by_order()
. You can optionally pass an $order object if you do not want to fetch last visited for the current user (current order id).
Autocomplete searchbox
Use the code snippet below to create a search box with autocomplete.
<form id="searchbar"> <input type="text" name="search_value" id="search_value" class="header-searchbar__input" /> <div id="search_autocomplete" class="search-autocomplete"></div> <script> var search_request; zaj.ready(function(){ var $sa = $('#search_autocomplete'); $sa.fadeOut(0); search_request = zaj.search.initialize($('#search_value'), { url: 'shop/ajax/search/', receiver: $sa, pushstate_url: null, callback: function(r){ $sa.fadeIn(500); $sa.html(r); } }); }); </script> <div class="clearfix"></div> </form>