Многоуровневое меню НЕ через wa_print_tree с class=selected и подсветкой parent
Форум »

Уважаемые коллеги прошу помощи. В очередной раз стал искать как вывести многоуровневое меню категорий с подстановкой соответствующих классов типа:
<ul>
<li class="parent selected">....
<ul>
<li class="parent selected">....
<ul>
<li>....
<li class="selected"> Активная категория
<li>....
<li>....
<li class="parent ">....
<ul>.....
<li>....
<li>....
<li>....
И в результате саккумулировал из найденного тут только такое решение:
{$path = [$category.id]}
{$parent = $wa->shop->category($category.parent_id)}
{if $parent.id|default:null > 0}
{$path[] = $parent.id}
{while $parent.id|default:null > 0}
{$parent = $wa->shop->category($parent.parent_id)}
{if $parent.id|default:null > 0}
{$path[] = $parent.id}
{/if}
{/while}
{/if}
<ul>
{foreach from=$wa->shop->categories(0, null, true) item=cat name=leftmenu}
{$sub2 = $wa->shop->categories($cat.id,null,true)}
<li class="{if count($sub2)>0}parent{/if} {if (in_array($cat.id, $path))} selected{/if}">
<a href="{$cat.url}">{$cat.name}</a>
{if count($sub2)>0}
<ul>
{foreach from=$sub2 item=cat2 name=subleftmenu}
{$sub3 = $wa->shop->categories($cat2.id, null, false, false)}
<li class="{if count($sub3)>0}parent{/if} {if (in_array($cat2.id, $path))} selected{/if}" >
<a href="{$cat2.url}">{$cat2.name} {$cat2.id} </a>
{if count($sub3)>0}
<ul>
{foreach from=$sub3 item=cat3 name=subleftmenu}
<li {if (in_array($cat3.id, $path))} class="selected"{/if}>
<a href="{$cat3.url}">{$cat3.name}</a>
</li>
{/foreach}
</ul>
{/if}
</li>
{/foreach}
</ul>
{/if}
</li>
{/foreach} </ul>
Все вроде работает но понимаю что это криво. Есть ли у кого более легкое и правильное. И не нашел как воткнуть количество товара в подобную схему.
Заранее спасибо.
А чем стандартный вариант не устраивает? Нужна рекурсия чтобы меню было по настоящему многоуровневым, вариантов его создания масса:
1. smarty - function
2. smarty - plugin
3. webasyst - helper
В качестве предупреждения для тех, кто захочет попробовать воспользоваться предложенным кодом: посчитайте, сколько раз выполняется (не упомянут в коде, а именно фактически выполняется) метод $wa->shop->categories() на одной странице. Лучше такой код не использовать.
Это понятно, что запросов многовато будет. Но не найду пока способа "подсветить" активного родителя. Может кто-что подскажет?
Решил прикрутить скрипт. Получилась такая схема:
Соответственно для формирования меню страниц модуля Site вышло:
Надеюсь разработчики допилят wa_print_tree для более тонкой настройки вывода меню всех приложений.
Опять коряво - поиск ссылки дублируется, должно быть что-то вроде этого:
Спасибо. Точно. Но "parent" надо все таки на "parents" ибо надо чтобы все родители наверх стали "active"