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

BITMAP

Уважаемые коллеги прошу помощи. В очередной раз стал искать как вывести многоуровневое меню категорий с подстановкой соответствующих классов типа:

<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>

Все вроде работает но понимаю что это криво. Есть ли у кого более легкое и правильное. И не нашел как воткнуть количество товара в подобную схему.
Заранее спасибо.

27 августа 2015
  • info@ravencode.ru 28 августа 2015 01:29

    А чем стандартный вариант не устраивает? Нужна рекурсия чтобы меню было по настоящему многоуровневым, вариантов его создания масса:

    1. smarty - function

    2. smarty - plugin

    3. webasyst - helper

    1. Михаил Ушенин 28 августа 2015 03:11

      В качестве предупреждения для тех, кто захочет попробовать воспользоваться предложенным кодом: посчитайте, сколько раз выполняется (не упомянут в коде, а именно фактически выполняется) метод $wa->shop->categories() на одной странице. Лучше такой код не использовать.

    2. BITMAP 28 августа 2015 03:35

      Это понятно, что запросов многовато будет. Но не найду пока способа "подсветить" активного родителя. Может кто-что подскажет?

    3. BITMAP 28 августа 2015 04:32

      Решил прикрутить скрипт. Получилась такая схема:

      {wa_print_tree tree=$wa->shop->categories(0, null, true) selected=$selected_category collapsible_class="submenu" unfolded=true class="menu" elem ='<a href=":url">:name</a>'}
      <script>
      var url = window.location.pathname;
      $('.menu li.selected a[href$="'+url+'"]').parents().addClass('selected'); </script>
    4. BITMAP 28 августа 2015 05:11

      Соответственно для формирования меню страниц модуля Site вышло:

      <!-- Меню страниц сайта -->
      {wa_print_tree tree=$wa->site->pages() class="menu" elem ='<a href=":url">:name</a>'}
      <script>
      var url = window.location.pathname;
      $('.menu li a[href$="'+url+'"]').addClass('active');
      $('.menu li a[href$="'+url+'"]').parents().addClass('active'); </script>

      Надеюсь разработчики допилят wa_print_tree для более тонкой настройки вывода меню всех приложений.

    5. info@ravencode.ru 2 сентября 2015 04:33

      Опять коряво - поиск ссылки дублируется, должно быть что-то вроде этого:

      $('.menu li a[href$="' + url + '"]').addClass('active').parent('li').addClass('active');
    6. BITMAP 3 сентября 2015 02:27

      Спасибо. Точно. Но "parent" надо все таки на "parents" ибо надо чтобы все родители наверх стали "active"

    Добавление новых комментариев к этой теме отключено.