МЕНЮ / Раздвижное меню групп магазина

Заметка создана: 14 января 2025 г.

Выводим рекурсивно раздвижное меню групп магазина на 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
});
});

Стили CSS

#blockGroups {
background-color: #fff;
border-bottom: 5px solid #e3c229;
margin-bottom: 50px;
padding: 16px 30px;
}
#blockGroups .titleH1 {
padding-bottom: 8px;
margin-bottom: 10px;
border-bottom: 1px solid #d6d6d6;
white-space: nowrap;
}
ul.blockGroupsList {
}
ul.blockGroupsList li {
padding-bottom: 8px;
margin-bottom: 10px;
border-bottom: 1px solid #d6d6d6;
}
ul.blockGroupsList li.last {
padding-bottom: 0;
margin-bottom: 0;
border-bottom: 0;
}
ul.blockGroupsList li a {
display: block;
font-size: 14px;
line-height: 18px;
font-family: 'pt_sansregular';
text-transform: uppercase;
text-decoration: none;
color: #1c1c1c;
position: relative;
padding-left: 12px;
}
ul.blockGroupsList li a:hover {
text-decoration: none;
color: #bfbfbf;
}
ul.blockGroupsList li a.current {
color: #bfbfbf;
}
ul.blockGroupsList li a span {
position: absolute;
top: 4px;
left: 0;
background: url(/templates/template1/images/blockGroupsListLink.png) no-repeat 0 0;
height: 7px;
width: 7px;
display: block;
}
ul.blockGroupsList li a:hover span {
background-position: 0 -7px;
}
ul.blockGroupsList li ul.blockGroupsSubList {
padding-top: 20px;
display: none;
}
ul.blockGroupsList li ul.blockGroupsSubList li {
padding: 10px 30px;
margin: 0 -30px;
border-bottom: none;
}
ul.blockGroupsList li ul.blockGroupsSubList li.current {
background-color: #ffdd40;
}
ul.blockGroupsList li ul.blockGroupsSubList li a {
text-transform: none;
position: relative;
padding-left: 33px;
}
ul.blockGroupsList li ul.blockGroupsSubList li a.current {
color: #1c1c1c;
}
ul.blockGroupsList li ul.blockGroupsSubList li a span {
position: absolute;
top: 8px;
left: 0;
background: url(/templates/template1/images/blockGroupsSubListLink.png) no-repeat 0 0;
height: 1px;
width: 23px;
display: block;
}