Меню плюс-минусом В стандартный код вывода дерева категорий над рекурсивной прорисовкой вложенных категорий добавляем кликабельные якоря (теги <a class="switch plus" onclick=""></a>), на них вешаем некий скрипт switchBranch, скрывающий-открывающий ul контейнер категории, ближайшей к этому якорю. В дополнительных стилях все ul контейнеры вложенных категорий по умолчанию делаем скрытыми и стилизуем кнопочку якоря, чтобы смотрелась как нам нужно.
Пример кода дерева категорий с внесенными изменениями:
<div id="categories">
{function name = 'categoriesTree'}
<ul>
{foreach $cats as $item}
<li>
<a href="{$site}{$item->url_path}{$item->url}">
{$item->name}
</a>
{if !empty($item->subcategories)}
<a class="switch plus" onclick="return switchBranch(this)"></a>
{categoriesTree cats = $item->subcategories}
{/if}
</li>
{/foreach}
</ul>
{/function}
{categoriesTree cats = $categories}
</div>
Теперь скрипт отработки кликов по якорю "плюс-минус".
<script type="text/javascript">
function switchBranch ( el ) {
if (jQuery(el).hasClass('plus')) {
jQuery(el).removeClass('plus').next('ul').first().show();
} else {
jQuery(el).addClass('plus').next('ul').first().hide();
}
return false;
}
</script>
Теперь дополнительные стили. Здесь кнопку делаем за счет текстовых символов + и -.
<style type="text/css">
#categories .switch {
background: #eee;
color: #080;
content: '-';
display: block;
float: right;
margin: 0 0 0 5px;
padding: 0;
line-height: 20px;
height: 20px;
width: 20px;
text-align: center;
text-decoration: none;
cursor: pointer;
}
#categories .switch.plus {
background: #eee;
color: #800;
content: '+';
}
#categories ul ul {
display: none;
}
</style>
Если можете нарисовать иконки размером 20x20 пикселей, тогда дополнительные стили будут такими:
<style type="text/css">
#categories .switch {
background: transparent url('../images/switch-minus.png') center center no-repeat;
display: block;
float: right;
margin: 0 0 0 5px;
padding: 0;
height: 20px;
width: 20px;
text-decoration: none;
cursor: pointer;
}
#categories .switch.plus {
background: transparent url('../images/switch-plus.png') center center no-repeat;
}
#categories ul ul {
display: none;
}
</style>
Если "плюс-минус" должен быть только на самых верхних категориях, тогда добавим стиль:
<style type="text/css">
#categories ul ul .switch {
display: none;
}
</style>
Или в коде вывода дерева категорий сделать вывод кнопок только для категорий верхнего уровня, для чего в функция вывода ввести контрольный параметр например level. Тогда код станет таким:
<div id="categories">
{function name = 'categoriesTree' level = 1}
<ul>
{foreach $cats as $item}
<li>
<a href="{$site}{$item->url_path}{$item->url}">
{$item->name}
</a>
{if !empty($item->subcategories)}
{if $level == 1}
<a class="switch plus" onclick="return switchBranch(this)"></a>
{/if}
{categoriesTree cats = $item->subcategories level = $level + 1}
{/if}
</li>
{/foreach}
</ul>
{/function}
{categoriesTree cats = $categories}
</div>