LemonStand Version 1 Has Been Discontinued
This documentation is for LemonStand Version 1. LemonStand is now offered as a cloud-based eCommerce platform.
You can try the new LemonStand and learn about upgrading here.
Displaying a List of Categories
You may need to display a list of all categories in your catalog, for example in a sidebar of your website.
Displaying a plain list of categories
You can use the following method if you are not going to use nested categories on your website. The code outputs only the root-level categories.
<? $categories = Shop_Category::create()->list_root_children(); ?>
<ul>
<? foreach ($categories as $category): ?>
<li>
<a href="<?= $category->page_url('/category') ?>"><?= $category->name ?></a>
</li>
<? endforeach; ?>
</ul>{% set categories = method('Shop_Category', 'create').list_root_children() %}
<ul>
{% for category in categories %}
<li>
<a href="{{ category.page_url('/category') }}">{{ category.name }}</a>
</li>
{% endfor %}
</ul>Displaying a hierarchical list of categories
Categories in LemonStand are hierarchical. You can use nested lists to represent the hierarchy. To display the category hierarchy, you need to use a partial, instead of placing the code right into a page. That allows you to display subcategories using the same code as you use to display top-level categories. Also, using partials is the best practice from the code reusing point of view. Once you have developed a partial for displaying a list of categories, you can render the partial on any page.
To output a hierarchical list of categories, create a new partial and assign it some meaningful name, for example shop:categories. The following code snippet demonstrates the possible content of the partial.
<?
if (!isset($category_url_name))
$category_url_name = null;
$categories = isset($parent_category) ? $parent_category->list_children() : Shop_Category::create()->list_root_children();
if ($categories->count): ?>
<ul>
<? foreach ($categories as $category): ?>
<li <? if ($category_url_name == $category->url_name): ?>class="current"<? endif ?>>
<a href="<?= $category->page_url('/category') ?>"><?= $category->name ?></a>
<? $this->render_partial('shop:categories', array('parent_category'=>$category)) ?>
</li>
<? endforeach; ?>
</ul>
<? endif ?>{% set categories = parent_category is defined ?
parent_category.list_children() :
method('Shop_Category', 'create').list_root_children() %}
{% if categories.count %}
<ul>
{% for category in categories %}
<li {% if category_url_name == category.url_name %}class="current"{% endif %}>
<a href="{{ category.page_url('/category') }}">{{ category.name }}</a>
{{ render_partial('shop:categories', {'parent_category': category}) }}
</li>
{% endfor %}
</ul>
{% endif %}Notice that this partial renders itself in line 12. This method is called recursion in programming. It allows you to use the same code for displaying the root-level and nested categories.
Now, having the partial developed, it is very easy to output a list of categories on any page:
The $catetory_url_name variable in the category list code is used for marking a current category. To mark a current category, pass category_url_name as a parameter in the render_partial method call.
<? $this->render_partial('shop:categories', array('category_url_name'=>'computers')) ?>{{ render_partial('shop:categories', {'category_url_name': 'computers'}) }}Needless to say, a value of category_url_name parameter could be dynamic. You can load the URL name of a current category on a category page, or from a product category on a product details page.
Managing the category order
LemonStand Administration Area allows you to manage the ordering of categories using a simple drag and drop technique. By default categories on the front-end website are ordered by name. If you want to output the categories accordingly the order you specified in the Administration Area, you should pass the 'front_end_sort_order' value to the category list_root_children and list_children methods. Below is an example code of the partial which we discussed above, which outputs categories in the order specified in the Administration Area.
<?
if (!isset($category_url_name))
$category_url_name = null;
$categories = isset($parent_category) ?
$parent_category->list_children('front_end_sort_order') :
Shop_Category::create()->list_root_children('front_end_sort_order');
if ($categories->count): ?>
<ul>
<? foreach ($categories as $category): ?>
<li <? if ($category_url_name == $category->url_name): ?>class="current"<? endif ?>>
<a href="<?= $category->page_url('/category') ?>"><?= $category->name ?></a>
<? $this->render_partial('shop:categories', array('parent_category'=>$category)) ?>
</li>
<? endforeach; ?>
</ul>
<? endif ?>{% set categories = parent_category is defined ?
parent_category.list_children('front_end_sort_order') :
method('Shop_Category', 'create').list_root_children('front_end_sort_order') %}
{% if categories.count %}
<ul>
{% for category in categories %}
<li {% if category_url_name == category.url_name %}class="current"{% endif %}>
<a href="{{ category.page_url('/category') }}">{{ category.name }}</a>
{{ render_partial('shop:categories', {'parent_category': category}) }}
</li>
{% endfor %}
</ul>
{% endif %}See also:
Next: Creating a Category Page
Previous: Categories
Return to Categories
