HostCMS 6: раскрывающееся меню для групп магазина. Вывод подгрупп текущего раздела
Сделал версию xsl шаблона для Host CMS 6.
Следующий код выводит группы магазина, при этом вложенные группы отображаются только у текущей группы.
Вывод подгрупп до любого уровня вложенности — основанно на коде от html
Улучшения для стилизации
Для вложенных сприсков ul через CSS класс указывается уровень вложенностьи level-1, level-2 и т.д.
Для текущего элемента li устанавливается CSS класс active, и если есть подгруппы — добавляется класс sub.
CSS классы могут быть использованны для улучшения вида дерева, например, можно специальным знаком помечать группы с подгруппами, чтобы было понятно — этот пункт меню можно развернуть. Вы можете настроить отображение каждого уровня меню в отдельностьи, используя стили для level-1..level-n.
В код основного шаблона добавить вставку в xml узла /shop/ТекущаяГруппа.
Добавть в шаблон в месте вывода групп код:
Код 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 > 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) > 0)
or (@id != $parent_group_id and count(.//shop_group[@id = $parent_group_id]) > 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>