Вывод подгрупп текущей группы в меню

#
Re: Вывод подгрупп текущей группы в меню
dreel писал(а):
Я так понимаю, что в Шаблон для Интернет-магазина слудющий блок кода вообще не нужен, т.к. он ничего не генерирует.

Отвечаю сам. Я ошибся - код правильно все генерирует, только данные выводяться внизу страницы, потому визуально я их не увидел.
#
Re: Вывод подгрупп текущей группы в меню
В результате я сделал версию для Host CMS 6.
Следующий код выводит группы магазина, при этом вложенные группы отображаются только у текущей группы.

Вывод подгрупп до любого уровня вложенности - основанно на коде от html
Улучшения для стилизации
Для вложенных сприсков ul через CSS класс указывается уровень вложенностьи level-1, level-2 и т.д.
Для текущего элемента li устанавливается CSS класс active, и если есть подгруппы - добавляется класс sub.

CSS классы могут быть использованны для улучшения вида дерева, например, можно специальным знаком помечать группы с подгруппами, чтобы было понятно - этот пункт меню можно развернуть. Вы можете настроить отображение каждого уровня меню в отдельностьи, используя стили для level-1..level-n.

В код основного шаблона добавить вставку в xml узла /shop/ТекущаяГруппа.
Добавть в шаблон в месте вывода групп код
// Разделы магазина
      if (Core::moduleIsActive('shop'))
      {
         $Shop_Controller_Show = new Shop_Controller_Show(
            Core_Entity::factory('Shop', 1)
         );
         $Current_Shop_Controller = Core_Page::instance()->object; // текущий объект данных

         $Shop_Controller_Show
            ->xsl(
               Core_Entity::factory('Xsl')->getByName('МагазинГруппыТоваровНаГлавной')
            )
            ->addEntity( // добваим ID текущей группы
               Core::factory('Core_Xml_Entity')
                  ->name('ТекущаяГруппа')->value($Current_Shop_Controller->group)
            )
            ->groupsMode('all') // включите вывод всех групп
            //->itemsForbiddenTags(array('text'))
            ->group(0)
            ->limit(0)
            ->show();
      }


Код XSL для Host CMS 6:
<!-- МагазинГруппыТоваровНаГлавной -->
   
   <xsl:template match="/">
      <xsl:apply-templates select="/shop"/>
   </xsl:template>
   
   <!-- Шаблон для магазина -->
   <xsl:template match="/shop">
      <ul class="shop_list level-1">
         <xsl:apply-templates select="shop_group"/>
      </ul>
   </xsl:template>
   
   <!-- Меню групп товара, вывод подгрупп текущей группы -->
   <!-- Шаблон для групп товара -->
   <xsl:template match="shop_group">
      <xsl:variable name="nesting_level" select="count(ancestor::*)"/>
      <xsl:variable name="parent" select="@id"/>
      <xsl:variable name="parent_group_id" select="/shop/ТекущаяГруппа"/>
      <xsl:variable name="this_group_has_subgroups"   select="subgroups_count &gt; 0" />
      <xsl:variable name="this_group_is_current"   select="@id = $parent_group_id" />
      <xsl:variable name="has_subgroups"   select="(@id = $parent_group_id and count(shop_group) &gt; 0)
         or (@id != $parent_group_id and count(.//shop_group[@id = $parent_group_id]) &gt; 0)" />
      <xsl:variable name="item_nesting_level">
         level-<xsl:value-of disable-output-escaping="yes" select="$nesting_level+1"/>
      </xsl:variable>
      
      <!-- Готовим класс элемента -->
      <xsl:variable name="item_css_class">
         <xsl:if test="$this_group_has_subgroups = 1"> sub</xsl:if>
         <xsl:if test="$this_group_is_current = 1"> active</xsl:if>
      </xsl:variable>
      
      <li>
         <xsl:if test="normalize-space($item_css_class) != '' ">
            <xsl:attribute name="class">
               <xsl:value-of disable-output-escaping="yes" select="normalize-space($item_css_class)"/>
            </xsl:attribute>
         </xsl:if>
         <xsl:if test="$this_group_is_current = 1">
            <span title="{name}" hostcms:id="{@id}" hostcms:field="name" hostcms:entity="shop_group">
               <xsl:value-of disable-output-escaping="yes" select="name"/>
            </span>
         </xsl:if>
         <xsl:if test="@id != $parent_group_id">
            <a href="{url}" title="{name}" hostcms:id="{@id}" hostcms:field="name" hostcms:entity="shop_group">
               <xsl:value-of disable-output-escaping="yes" select="name"/>
            </a>
         </xsl:if>
         
         <!-- Если есть подгруппы -->
         <xsl:if test="$has_subgroups = 1">
            <ul id="group-{@id}">
               <xsl:if test="normalize-space($item_nesting_level) != '' ">
                  <xsl:attribute name="class">
                     <xsl:value-of disable-output-escaping="yes" select="normalize-space($item_nesting_level)"/>
                  </xsl:attribute>
               </xsl:if>
               <xsl:apply-templates select="shop_group"/>
            </ul>
         </xsl:if>
      </li>
   </xsl:template>
#
Re: Вывод подгрупп текущей группы в меню
#
Re: Вывод подгрупп текущей группы в меню
Оказалось Core_Page::instance()->object не всегда заполнен, потому на страницах без товаров в выводе меню возникала ошибка попытки доступа к свойству у не объекта.
Я вставил код проверок и разместил новый вариант у себя в журнале для дальнейшей доработки, если еще пробемы будут.
#
Re: Вывод подгрупп текущей группы в меню
Можете поподробнее объяснить про "В код основного шаблона добавить вставку в xml узла /shop/ТекущаяГруппа."?? Непонятен этот момент. Я новичок в Hostcms.
#
Re: Вывод подгрупп текущей группы в меню
Отличная доработка.
Но есть один вопрос.
В данном примере на сайт попадают подразделы именно активного раздела. А как быть если меню сдлано в виде аккордиона?
Тоесть нужно выводить все подразделы, а не только активный раздел
dankom
#
Re: Вывод подгрупп текущей группы в меню
Никто не поможет?
dankom
Авторизация