Выводим рекурсивно раздвижное меню групп магазина на jQuery в макет страницы, с передачей параметра в XML текущей группы.

1. В макете страницы выводим блок с кодом:
<div id="blockGroups">
<?php
if (Core::moduleIsActive('shop'))
{
$Shop_Controller_Show = new Shop_Controller_Show(
Core_Entity::factory('Shop', 1)
);
if (is_object(Core_Page::instance()->object)
&& get_class(Core_Page::instance()->object) == 'Shop_Controller_Show')
{
$Shop_Controller_Show->addEntity(
Core::factory('Core_Xml_Entity')
->name('current_group_id')
->value(intval(Core_Page::instance()->object->group))
);
}
$Shop_Controller_Show
->xsl(
Core_Entity::factory('Xsl')->getByName('МагазинГруппыТоваровЛевоеМеню')
)
->groupsMode('all');
$Shop_Controller_Show->show();
}
?>
</div>
Меняете параметры в коде на свои:
1. «1» — ID магазина
2. «МагазинГруппыТоваровЛевоеМеню» — XSL шаблон вывода
3. XML тег вывода значения текущей группы current_group_id — можно поменять на свой, можно оставить
2. Создаём Xsl шаблон:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE xsl:stylesheet>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:hostcms="http://www.hostcms.ru/"
exclude-result-prefixes="hostcms">
<xsl:output xmlns="http://www.w3.org/TR/xhtml1/strict" doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN" encoding="utf-8" indent="yes" method="html" omit-xml-declaration="no" version="1.0" media-type="text/xml"/>
<xsl:template match="/">
<xsl:apply-templates select="/shop"/>
</xsl:template>
<!-- Шаблон для магазина -->
<xsl:template match="/shop">
<div class="titleH1">
<xsl:value-of disable-output-escaping="yes" select="name"/>
</div>
<ul class="blockGroupsList">
<xsl:apply-templates select="shop_group"/>
</ul>
</xsl:template>
<!-- Шаблон для групп товара -->
<xsl:template match="shop_group">
<xsl:variable name="current_group_id" select="/shop/current_group_id"/>
<li>
<xsl:variable name="li_class">
<xsl:if test="position() = last()"> last</xsl:if>
<xsl:if test="$current_group_id = @id or count(.//shop_group[@id=$current_group_id])=1"> current</xsl:if>
</xsl:variable>
<xsl:attribute name="class">
<xsl:value-of select="normalize-space($li_class)"/>
</xsl:attribute>
<a href="{url}">
<xsl:if test="$current_group_id = @id or count(.//shop_group[@id=$current_group_id])=1">
<xsl:attribute name="class">
<xsl:text>current</xsl:text>
</xsl:attribute>
</xsl:if>
<span></span><xsl:value-of disable-output-escaping="yes" select="name"/>
</a>
<!-- Если есть подгруппы -->
<xsl:if test="shop_group">
<ul class="blockGroupsSubList">
<xsl:apply-templates select="shop_group"/>
</ul>
</xsl:if>
</li>
</xsl:template>
</xsl:stylesheet>
3. В head сайта подключаете библиотеку jQuery, по-умолчанию она в HostCMS подключена, имеет вид
<script type="text/javascript" src="/hostcmsfiles/jquery/jquery.js"></script>
4. Во вкладке Основного макета Javascript размешаем скрипт раскрывающегося меню:
(function ($) {
$.fn.liHarmonica = function (params) {
var p = $.extend({
currentClass: 'current',
onlyOne: true,
speed: 500
}, params);
return this.each(function () {
var
el = $(this).addClass('harmonica'),
linkItem = $('ul', el).prev('a');
el.children(':last').addClass('last');
$('ul', el).each(function () {
$(this).children(':last').addClass('last');
});
$('ul', el).prev('a').addClass('harFull');
el.find('.' + p.currentClass).parents('ul').show().prev('a').addClass(p.currentClass).addClass('harOpen');
el.find('.allways').parents('ul').addClass('allwaysParent').show().prev('a').addClass('harOpen').addClass('allwaysOpen');
linkItem.on('click', function () {
if ($(this).next('ul').is(':hidden')) {
$(this).addClass('harOpen');
} else {
$(this).removeClass('harOpen');
}
if (p.onlyOne) {
$(this).closest('ul').closest('ul').find('ul').not($(this).next('ul')).slideUp(p.speed).prev('a').removeClass('harOpen');
$(this).next('ul').slideToggle(p.speed);
} else {
$(this).next('ul').stop(true).slideToggle(p.speed);
}
return false;
});
});
};
})(jQuery);
/* Инициализация */
$(function () {
$('.blockGroupsList').liHarmonica({
onlyOne: true,
speed: 500
});
});