Динамическое подменю для демо-сайта Современный (xslt)
Задача: На демо-сайте по продаже бытовой техники есть подменю, подменю находится слева и представляет из себя разделы каталога, и подразделы каталога. Все разделы каталога раскрыты (показывают подразделы) и не изменяются при переходе на разделы или подразделы. В этой статье мы рассмотрим как сделать динамическое меню, для этого сайта, поскольку многие пользователю берут за основу своего сайта именно функционал демо-сайта Современный.
Решение: Нам необходимо, чтобы все разделы каталога были свернуты, при нажатии на раздел, показывались подразделы, при нажатии на подраздел показывались товары подраздела, или дочерние подразделы если они есть. При переходе в другой раздел каталога, предыдущий закрывается, а текущий наоборот раскрывается. Подменю демо-сайта, построено с помощью вызовов catalog getCategoryList и catalog getObjectsList, поэтому нам не нужно ставить галочки "Отображать в меню", "Показывать подменю", потому что они ни как не будут влиять на данные вызовы (эти галочки влияют если меню создано вызовом content menu)
1. Шаблоны подменю находятся по пути ~xsltTpls/modules/catalog/left-column-category-list.xsl. Необходимо чтобы в этом файле был следующий код (все предыдущее содержание файла удаляем) :
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE xsl:stylesheet SYSTEM "ulang://i18n/constants.dtd:file">
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:umi="http://www.umi-cms.ru/TR/umi">
<xsl:template match="udata[@method = 'getCategoryList']" mode="left-column">
<ul class="catalog_menu" umi:button-position="bottom left"
umi:element-id="{@category-id}" umi:region="list" umi:module="catalog" umi:sortable="sortable">
<xsl:apply-templates select="//item" mode="left-column" />
</ul>
</xsl:template>
<xsl:template match="udata[@method = 'getCategoryList']//item" mode="left-column">
<li umi:element-id="{@id}" umi:region="row">
<span>
<a href="{@link}" umi:field-name="name" umi:delete="delete" umi:empty="&empty-section-name;">
<xsl:value-of select="." />
</a>
</span>
<xsl:if test="(@id=$document-page-id) or (@id=$document-page-parent-id/page/@id)">
<xsl:apply-templates select="document(concat('udata://catalog/getCategoryList/void/', @id))"
mode="left-column-sub"/>
</xsl:if>
</li>
</xsl:template>
<!--шаблон для подразделов 2 и более уровней-->
<xsl:template match="udata[@method = 'getCategoryList']" mode="left-column-sub">
<ul umi:element-id="{@category-id}" umi:region="list" umi:module="catalog" umi:sortable="sortable"
umi:button-position="top right">
<xsl:apply-templates select="//item" mode="left-column-sub"/>
</ul>
</xsl:template>
<xsl:template match="udata[@method = 'getCategoryList']//item" mode="left-column-sub">
<li umi:element-id="{@id}" umi:region="row">
<a href="{@link}" umi:field-name="name" umi:delete="delete" umi:empty="&empty-section-name;">
<xsl:value-of select="." />
</a>
<xsl:if test="(@id=$document-page-id) or (@id=$document-page-parent-id/page/@id)">
<xsl:apply-templates select="document(concat('udata://catalog/getCategoryList/void/', @id))"
mode="left-column-sub"/>
</xsl:if>
</li>
</xsl:template>
</xsl:stylesheet>
2. В файл, находящийся по пути ~xsltTpls/default.xsl добавляем строку
<xsl:variable name="document-page-parent-id" select="/result/parents" />