Image

HostCMS 6: раскрывающееся меню для групп магазина. Вывод подгрупп текущего раздела

Сделал версию xsl шаблона для 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)
    );
    $Shop_Controller_Show
    ->xsl(
    Core_Entity::factory('Xsl')->getByName('МагазинГруппыТоваровНаГлавной')
    );
    $Current_Shop_Controller = Core_Page::instance()->object;
    if (is_object($Current_Shop_Controller)
    && get_class($Current_Shop_Controller) == 'Shop_Controller_Show'
    && $Current_Shop_Controller->group)
    {
        $Shop_Controller_Show
        ->addEntity(
        Core::factory('Core_Xml_Entity')
        ->name('ТекущаяГруппа')->value(intval($Current_Shop_Controller->group))
        );
    }
    
    $Shop_Controller_Show
    ->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">
            <xsl:choose>
                <xsl:when test="/shop/ТекущаяГруппа/node()"><xsl:value-of select="/shop/ТекущаяГруппа"/></xsl:when>
                <xsl:otherwise>-1</xsl:otherwise>
            </xsl:choose>
        </xsl:variable>
        <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>
Получаем на выходе HTML:
<ul class="shop_list level-1">
  <li class="sub">
    <a class="hostcmsEditable" xmlns:hostcms="http://www.hostcms.ru/" href="/shop/costume-jewellery/" title="Бижутерия" hostcms:id="593" hostcms:field="name" hostcms:entity="shop_group">Бижутерия</a>
  </li>
  <li>
    <a class="hostcmsEditable" xmlns:hostcms="http://www.hostcms.ru/" href="/shop/handmade/" title="Handmade" hostcms:id="592" hostcms:field="name" hostcms:entity="shop_group">Handmade</a>
  </li>
  <li class="sub active">
    <span class="hostcmsEditable" xmlns:hostcms="http://www.hostcms.ru/" title="Для волос" hostcms:id="591" hostcms:field="name" hostcms:entity="shop_group">Для волос</span>
    <ul id="group-591" class="level-2">
      <li>
        <a class="hostcmsEditable" xmlns:hostcms="http://www.hostcms.ru/" href="/shop/for-the-hair/gum/" title="Резинки" hostcms:id="598" hostcms:field="name" hostcms:entity="shop_group">Резинки</a>
      </li>
      <li>
        <a class="hostcmsEditable" xmlns:hostcms="http://www.hostcms.ru/" href="/shop/for-the-hair/barrettes/" title="Заколки" hostcms:id="599" hostcms:field="name" hostcms:entity="shop_group">Заколки</a>
      </li>
      <li>
        <a class="hostcmsEditable" xmlns:hostcms="http://www.hostcms.ru/" href="/shop/for-the-hair/crabs/" title="Крабы" hostcms:id="600" hostcms:field="name" hostcms:entity="shop_group">Крабы</a>
      </li>
      <li>
        <a class="hostcmsEditable" xmlns:hostcms="http://www.hostcms.ru/" href="/shop/for-the-hair/combs/" title="Гребни" hostcms:id="601" hostcms:field="name" hostcms:entity="shop_group">Гребни</a>
      </li>
    </ul>
  </li>
  <li class="sub">
    <a class="hostcmsEditable" xmlns:hostcms="http://www.hostcms.ru/" href="/shop/accessories/" title="Аксессуары" hostcms:id="590" hostcms:field="name" hostcms:entity="shop_group">Аксессуары</a>
  </li>
</ul>