Активная подкатегория подсвечивает родителя Есть решение

Есть ли возможность через smarty-плагин wa_print_tree подсветить родителя активной подкатегории.

Вообще было бы классно подсвечивать весь путь до активной подкатегории. Сейчас приходится пользоваться костылями на скриптах. =(


3 ответа

  • 5
    Михаил Ушенин Webasyst 31 марта 2015 05:19 # Решение

    Можно наколдовать примерно вот так (при необходимости добавив нужных параметров из wa_print_tree средствами Smarty типа selected и class). Небольшой недостаток — пара лишних SQL-запросов для получения id родителей в первом куске кода.

    {$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}
    
    {function tree}
        <ul>
            {foreach $items as $item}
                <li>
                    <a href="{$item.url}"{if (in_array($item.id, $path))} class="current_path"{/if}>{$item.name|escape}</a>
                    {if $item.childs|default:null}
                        {tree items=$item.childs}
                    {/if}
                </li>
            {/foreach}
        </ul>
    {/function}
    
    {tree items=$wa->shop->categories(0, null, true)}
    • +1

      Михаил, спасибо! Буду пробовать! =)

    • +1

      Способ отлично работает! Ещё раз спасибо!
      Михаил, может быть подскажете, есть ли возможность отследить главных родителей в получившемся дереве категорий.

      Я хочу всем элементам первого уровня присвоить один класс, а все остальным - дочерним другой класс.. Сейчас приходится делать это через JS.

      Примерно так:

      ul
      li.parent

      --ul
      ---li.child
      ---li.child
      --/ul

      li.parent
      /ul


      • +1

        1. Добавьте в функцию tree параметр level, вот так:

        {function tree level=0}

        2. При рекурсивном вызове функции внутри самой себя указывайте увеличенное на 1 значение этого параметра:

        {tree items=$item.childs level=$level + 1}

        3. В нужном месте в теле функции добавьте условие

        {if $level == 0}добавляйте/отображайте тут нужное содержимое для самого верхнего уровня{/if}

        или

        {if $level == 0}добавляйте/отображайте тут нужное содержимое для самого верхнего уровня{else} а тут для всех остальных вложенных уровней{/if}

    • +1
      Влад Влад 10 июня 2015 20:53 #

      Михаил, подскажите пожалуйста, а как тут определить наличие вложенных категорий? Хочется вывести доп. класс "dropdown" для родительской категории.

      Спасибо!

      • +2

        Используйте условие

        {if $item.childs|default:null}...{/if}

        Оно, кстати, уже используется в функции для отображения вложенных элементов, если они есть у текущей категории.

      • +1
        Влад Влад 11 июня 2015 06:45 #

        Что-то сразу не догадался. {if $item.childs|default:null}class="dropdown"{/if}

  • 1

    Встроенный wa_print_tree не умеет подсвечивать родителя. Всегда можно сделать свой с любым блэкджеком, в принципе...

    Если что, стандартный можно скопировать отсюда (и положить копию рядом):

    wa-system/vendors/smarty-plugins/function.wa_print_tree.php

    • +1

      Леонид, спасибо за ответ!

      Я, к сожалению, как разработчик тем, не могу выходить за пределы папки темы дизайна. =((

      • +1
        Max Vecheslavov Max Vecheslavov 2 апреля 2015 10:14 #

        Вы как разработчик тем можете использовать javascript. Рекурсивно проходите все узлы в поисках текущего, а затем возвращаетесь к родителю и присваиваете ему нужный класс.

  • 1

    А как обнулить {function tree} ?
    Хочу использовать эту функцию для вывода страниц сайта с одной структурой, и для вывода категорий магазина с другой структурой.

Добавить ответ

Чтобы добавить комментарий, зарегистрируйтесь или войдите