wa_print_tree не выводит список категорий Есть решение

Решил создать второе меню по направлениям, воспользовался шпаргалкой и пошел по пути wa_print_tree

Код вышел следующий

<div class="sbNav1 sidebar__block mb-401">
                    <a class="sbNav__header" href="#sidebarNav1" data-toggle="collapse">[`Направления`]</a>
            <ul class="list-group collapse in" id="sidebarNav1">
                                                        {$wa->shop->categories(257, null, true, fallse, null)}
            </div>

Но при этом раскладе выводится надпись Array а самих данных массива и не видать. Не подскажете, в чем состоит загвоздка?

14 ответов

  • 1
    Михаил Ушенин Webasyst 25 октября 2018 19:12 # Решение

    Вы пишете о wa_print_tree, а пытаетесь использовать {$wa->shop->categories()}. О чём ваш вопрос?

    • +1
      Алексей Бухтеев Алексей Бухтеев 25 октября 2018 20:05 #

      Да, Вы правы, белиберда вышла. Копипаст сработал некорректно.

      Вот корректный код:

      <div class="sbNav1 sidebar__block mb-401">
                          <a class="sbNav__header" href="#sidebarNav1" data-toggle="collapse">[`Направления`]</a>
                  <ul class="list-group collapse in" id="sidebarNav1">
      {$wa->shop->categories(257, null, true, fallse, null)}
      {wa_print_tree tree=$categories unfolded=true collapsible_class='collapsible' class="list-group collapse in" elem ='<a href=":url" title=":name">:name</a>'}
                  </div>

      Суть вопроса в том, как посредством wa_print_tree вывести массив всех подкатегорий находящихся в категории 257.

      Код ошибки:

      Array 
      Warning: Invalid argument supplied for foreach() in /var/www/u5147045/data/www/stylist-shop.ru/wa-system/vendors/smarty-plugins/function.wa_print_tree.php on line 52

      То есть что-то конфликтует с 

      function.wa_print_tree.php

      , а что именно я не могу понять

      • +1
        Михаил Ушенин Михаил Ушенин Webasyst 26 октября 2018 09:04 #

        Замените

        {$wa->shop->categories(257, null, true, fallse, null)}

        на

        {$categories = $wa->shop->categories(257, null, true)}

        • +1
          Алексей Бухтеев Алексей Бухтеев 26 октября 2018 09:31 #

          Спасибо. удалось вывести меню. Однако через wa_print_tree оно оказалось совсем не симпатичным.

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

          unfolded настраивается так, что либо видно все дерево, либо только родительские категории...

          Вопрос: можно ли вообще через wa-print-tree сделать аналог стандартного бокового меню или проще поискать другой способ вывода?

          • +1
            Михаил Ушенин Михаил Ушенин Webasyst 26 октября 2018 09:57 #

            {wa_print_tree} только формирует HTML-код списка <ul>. Стилизовать его нужно средствами CSS, а поведение формировать средствами JavaScript.

          • +1
            replicant replicant 26 октября 2018 17:33 #

            wa_print_tree конечно штука простая, но кастомизировать его потом не очень удобно, хотя и возможно, но это скорее субъективное т.к. я не люблю списки в основном меню категорий без жесткой необходимости. У вас же есть перед глазами пример как сделано родное меню. Сделайте так же. Если на вашем сайте будет 2 уровня вложенности категорий, то {$categories = $wa->shop->categories(0, 2, true)}, а внутри этого первого foreach прогоните ещё один по $category.childs и кастомизируйте вывод первого и второго уровней как угодно независимо друг от друга в блоках с разными стилями и свойствами css. Реакции можно навешивать через простейшие js такого типа $(".menu").click(function () {$(this).siblings(".submenu").slideToggle(150);});.

            • +1
              Алексей Бухтеев Алексей Бухтеев 28 октября 2018 12:13 #

              Неужели нет способа вывести две родительских категории в разные меню?

              Ваш метод не плох, но тут возникнет проблема с усложнением ЧПУ, чего не очень хотелось бы. Из-за корявого импорта из 1С мне уже и так приходится глушить одну родительскую категорию и работать только с ее подкатегориями, а следовательно если пойти по предложенному Вами пути, то будет еще больше каши и круговерти..(

              • +1
                replicant replicant 28 октября 2018 17:55 #

                Надо просто формировать одно меню как $wa->shop->categories(id  первого родителя, 2, true)} и второе как $wa->shop->categories(id второго родителя, 2, true)}

                Конечно мне вся глубина проблемы, включая 1С, не видна, но два разных меню с двумя родителями (да хоть 10) вроде бы не проблема совсем.

                • +1
                  Алексей Бухтеев Алексей Бухтеев 28 октября 2018 18:05 #

                  Если прописывать так, то возникает проблема в том, что переменная categories одна и та же и в нее просто перезаписываются данные вторым условием и получается, что работать может только второе меню, а первое соответственно не срабатывает.

                  Я поднимал эту же тему в других топиках, но там либо не отвечают, либо хамят.

                  https://support.webasyst.ru/fo...

                  • +1
                    replicant replicant 28 октября 2018 18:23 #

                    Нет-нет-нет. Работать будут оба меню четко и безупречно. Весь вопрос скорее всего у вас встал на стадии, когда имеющийся JS код или способ создания меню приводят к неправильной работе интерфейса возможно.

                    Дело в том, что никаких условий там перезаписываться ничем не должно. Переменные могут быть разные.

                    {$categories = $wa->shop->categories(257, null, true)}
                    
                    {$categories2 = $wa->shop->categories(269 например, null, true)}

                    В случае без print_tree просто в одном цикле выводите содержимое категорий первого родителя, а во втором - второго. Вы же четко запрашиваете по ID родителя конкретные данные и их и получаете.

                    Давайте сделаем так. Начните с самого простого. На пустой HTML странице, созданной в приложении Магазин, сначала выведите двух родителей с их детьми первого уровня таким образом

                    {foreach $wa->shop->categories(id первого родителя,2,true) as $c1}
                     <a href="{$c1.url}">
                        {foreach $c1.childs as $sc1}
                            <a href="{$sc1.url}">{$sc1.name}</a>
                        {/foreach}
                    {/foreach}
                    
                    {foreach $wa->shop->categories(id второго родителя,2,true) as $c2}
                     <a href="{$c2.url}">
                        {foreach $c2.childs as $sc2}
                            <a href="{$sc2.url}">{$sc2.name}</a>
                        {/foreach}
                    {/foreach}

                    Потом проведите ваши опыты с 1С и посмотрите изменится ли что-то в этом выводе. Если все сделано правильно, то ничего не должно поменяться и/или перезаписаться одно на другое.

                    Затем потихоньку начинайте кастомизировать вывод через CSS и прицеплять к этому хозяйству JS, но не обязательно те, которые есть в вашей теме дизайна, т.к. с ними видимо возникают сложности. Можете в сети найти массу примеров различных красивых меню на JS от простейших до сложных.

                    Хотя всё это можно делать и одним выводом типа от самого корня, но на один уровень глубже, если не требуется разносить эти меню совсем друг от друга.

                    $wa->shop->categories(0,3,true)


                    • +1
                      Алексей Бухтеев Алексей Бухтеев 31 октября 2018 13:49 #

                      Большое спасибо за подсказку, так уже становится яснее. Но все же не до конца понимаю алгоритм работы с уровнями вложенности.

                      По Вашему коду выходит так, что выдаются только категории 3го уровня...
                      Сейчас у меня:
                      1. косметика

                        1.1. aravia

                          1.1.1. Депиляция

                      2. Направления

                         2.1. Перед депиляцией

                      Соответственно для первого меню выводятся только пункты 3го уровня, т.е. 1.1.1.

                      А для второго меню не выводится вообще ничего, т.к. там просто нет 3го уровня вложенности.

                      Как я понимаю в коде

                      {foreach $wa->shop->categories(id второго родителя,2,true)

                      число 2 отвечает за глубину вложенности, менял его на 1 и 0, но тогда вообще ничего не выводится.

                    • +1
                      Алексей Бухтеев Алексей Бухтеев 14 ноября 2018 08:34 #

                      Пободался пободался и снова уперся в неизвестную проблему.

                      Удалось кастомизировать вывод меню по тому же принципу что и стандартное меню, но есть огромная проблема, показывает только первый уровень вложенности категорий..
                      1. Категории
                      1.1 для депиляции
                      1.1.1 перед депиляцией

                      Вывод категории уровня 1 я отсек путем указания этой категории как родительской.
                      1.1 выводится и работает, но не выдает стрелочку рядом с этим пунктом меню для вывода 1.1.1

                      Код следующий

                      {if $wa->shop}
                          {function name="catalog_side_subitem1" item=[] depth=3 level=0}
                              {if count($item1.childs) && $item1.depth < $depth1}
                                  {if $item1.depth > $level1}
                                      {$class2 = "dropdown-submenu"}
                                  {else}
                                      {$class2 = "dropdown"}
                                  {/if}
                                  <li class="{$class2}{if $wa->shop->categories(256,null,true) == $item1.id} active{/if}">
                                      {if isset($item1.params.badge) && isset($item1.params.badgeclass) && $item1.depth>0}
                                          <span class="badge {$item1.params.badgeclass} sbNav__badge">{$item1.params.badge}</span>
                                      {/if}
                                      <a href="{$item1.url}" data-icon-id="{$item1.id}">{$item1.name}</a>
                                      <ul class="dropdown-menu">
                                          {foreach $item1.childs as $ic1}
                                              {catalog_side_subitem1 item=$ic1 level=$level1}
                                          {/foreach}
                                      </ul>
                                  </li>
                              {else}
                                  <li{if $wa->shop->categories(256,null,true) == $item1.id} class="active"{/if}>
                                      {if isset($item1.params.badge) && isset($item1.params.badgeclass) && $item1.depth>0}
                                          <span class="badge {$item1.params.badgeclass} sbNav__badge">{$item1.params.badge}</span>
                                      {/if}
                                      <a href="{$item1.url}" data-icon-id="{$item1.id}">{$item1.name}</a>
                                  </li>
                              {/if}
                          {/function}
                      
                          {function name="catalog_side_item1" item=[] depth=2 level=0}
                              {if count($item1.childs) && $item1.depth < $depth1}
                                  <li class="list-group-item list-toggle sbNav__li sbNav__hover{if $wa->shop->categories(256,null,true) == $item1.id} active{/if}">
                                      {if isset($item1.params.badge) && isset($item1.params.badgeclass) && $item1.depth>0}
                                          <span class="badge {$item1.params.badgeclass} sbNav__badge">{$item1.params.badge}</span>
                                      {/if}
                                      <a href="{$item1.url}" class="sbNav__link" data-icon-id="{$item1.id}">{$item1.name}</a>
                                      <ul class="dropdown-menu">
                                          {foreach $item1.childs as $ic1}
                                              {catalog_side_subitem1 item=$ic1 level=$level1}
                                          {/foreach}
                                      </ul>
                                  </li>
                              {else}
                                  <li class="list-group-item list-toggle sbNav__li{if $wa->shop->categories(256,null,true) == $item1.id} active{/if}">
                                      {if isset($item1.params.badge) && isset($item1.params.badgeclass) && $item1.depth>0}
                                          <span class="badge {$item1.params.badgeclass} sbNav__badge">{$item1.params.badge}</span>
                                      {/if}
                                      <a href="{$item1.url}" data-icon-id="{$item1.id}" class="sbNav__link">{$item1.name}</a>
                                  </li>
                              {/if}
                          {/function}
                      
                          <div class="sbNav sidebar__block mb-401">
                              {if count($wa->shop->categories(256,null,true)) > 0}
                                  <a class="sbNav__header" href="#sidebarNav7" data-toggle="collapse">[`Направления`]</a>
                                  <ul class="list-group collapse in" id="sidebarNav7">
                                      {foreach $wa->shop->categories(256,null,true) as $item1}
                                          {catalog_side_item1 item=$item1 level=$item1.depth}
                                      {/foreach}
                                  </ul>
                              {/if}
                          </div>
                      {/if}

                      Я не совсем понимаю за что отвечают данные в скобках в коде 

                      $wa->shop->categories(256,null,true)

                      Может тут кроется суть того, почему у меня дочерние категории не выводятся.. Потому что мне кажется, что я в этих скобках указываю какое-то ограничение на вывод и вместе с этим ограничением прописываю все это в переменную из которой потом уже соответственно ничего нельзя вытащить.

                      • +2
                        Михаил Ушенин Михаил Ушенин Webasyst 14 ноября 2018 09:25 #
                        1. В блоке .mb-401 вы дважды вызываете метод получения списка категорий. Это повышенная нагрузка на сервер баз данных. Можно обойтись одним вызовом.
                        2. В этом блоке вы вызываете функцию {catalog_side_item1} с параметром item, а в теле функции используете параметр с именем item1.
                        3. То же самое с функцией {catalog_side_subitem1}.
                        Я не совсем понимаю за что отвечают данные в скобках в коде

                        Посмотрите описание этого метода в "Шпаргалке".

                        • +1
                          Алексей Бухтеев Алексей Бухтеев 14 ноября 2018 09:53 #

                          Спасибо большое. Разобрался. Не подумал, что внутренние параметры функции тоже выступают как переменные.

                          Двойной вызов, который вы описали в пункте 1 Вы имеете ввиду 

                          {if count($wa->shop->categories(256,null,true)) > 0}

                          и

                          {foreach $wa->shop->categories(256,null,true) as $item1}

                          ?

                          Это не моя придумка, так написан код вызова стандартного меню в моей шаблоне..

                          Для тех, кто следит за данной веткой, прикладываю итоговый(рабочий) код меню.


                          {if $wa->shop}
                              {function name="catalog_side_subitem1" item1=[] depth1=3 level1=0}
                                  {if count($item1.childs) && $item1.depth < $depth1}
                                      {if $item1.depth > $level1}
                                          {$class2 = "dropdown-submenu"}
                                      {else}
                                          {$class2 = "dropdown"}
                                      {/if}
                                      <li class="{$class2}{if $wa->shop->categories(256,null,true) == $item1.id} active{/if}">
                                          {if isset($item1.params.badge) && isset($item1.params.badgeclass) && $item1.depth>0}
                                              <span class="badge {$item1.params.badgeclass} sbNav__badge">{$item1.params.badge}</span>
                                          {/if}
                                          <a href="{$item1.url}" data-icon-id="{$item1.id}">{$item1.name}</a>
                                          <ul class="dropdown-menu">
                                              {foreach $item1.childs as $ic1}
                                                  {catalog_side_subitem1 item1=$ic1 level1=$level1}
                                              {/foreach}
                                          </ul>
                                      </li>
                                  {else}
                                      <li{if $wa->shop->categories(256,null,true) == $item1.id} class="active"{/if}>
                                          {if isset($item1.params.badge) && isset($item1.params.badgeclass) && $item1.depth>0}
                                              <span class="badge {$item1.params.badgeclass} sbNav__badge">{$item1.params.badge}</span>
                                          {/if}
                                          <a href="{$item1.url}" data-icon-id="{$item1.id}">{$item1.name}</a>
                                      </li>
                                  {/if}
                              {/function}
                          
                              {function name="catalog_side_item1" item1=[] depth1=2 level1=0}
                                  {if count($item1.childs) && $item1.depth < $depth1}
                                      <li class="list-group-item list-toggle sbNav__li sbNav__hover{if $wa->shop->categories(256,null,true) == $item1.id} active{/if}">
                                          {if isset($item1.params.badge) && isset($item1.params.badgeclass) && $item1.depth>0}
                                              <span class="badge {$item1.params.badgeclass} sbNav__badge">{$item1.params.badge}</span>
                                          {/if}
                                          <a href="{$item1.url}" class="sbNav__link" data-icon-id="{$item1.id}">{$item1.name}</a>
                                          <ul class="dropdown-menu">
                                              {foreach $item1.childs as $ic1}
                                                  {catalog_side_subitem1 item1=$ic1 level1=$level1}
                                              {/foreach}
                                          </ul>
                                      </li>
                                  {else}
                                      <li class="list-group-item list-toggle sbNav__li{if $wa->shop->categories(256,null,true) == $item1.id} active{/if}">
                                          {if isset($item1.params.badge) && isset($item1.params.badgeclass) && $item1.depth>0}
                                              <span class="badge {$item1.params.badgeclass} sbNav__badge">{$item1.params.badge}</span>
                                          {/if}
                                          <a href="{$item1.url}" data-icon-id="{$item1.id}" class="sbNav__link">{$item1.name}</a>
                                      </li>
                                  {/if}
                              {/function}
                          
                              <div class="sbNav sidebar__block mb-401">
                                      <a class="sbNav__header" href="#sidebarNav7" data-toggle="collapse">[`Направления`]</a>
                                      <ul class="list-group collapse in" id="sidebarNav7">
                                          {foreach $wa->shop->categories(256,null,true) as $item1}
                                              {catalog_side_item1 item1=$item1 level1=$item1.depth}
                                          {/foreach}
                                      </ul>
                              </div>
                          {/if}

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

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