UMIhelp

Разработка сайта на UMI.CMS => Шаблоны XSLT => Тема начата: DZHETIGAPA от 06 Декабря 2011, 01:38:43

Название: Активный раздел
Отправлено: DZHETIGAPA от 06 Декабря 2011, 01:38:43
Сделал вывод левого меню каталога. Как определить активный раздел? То есть раздел, в котором я нахожусь, должен подсвечиваться в левом меню

Как такое можно реализовать?
Название: Re:Активный раздел
Отправлено: DZHETIGAPA от 06 Декабря 2011, 01:50:42
Сделал по этой ссылке:

http://www.umi-cms.ru/support/forum/razrabotka_sajtov/vydelit_aktivnyj_razdel/
Название: Re:Активный раздел
Отправлено: admin от 06 Декабря 2011, 21:03:10
если используешь xslt, то этот кастомный макрос лишние телодвижения создает.

При выводе разделов слева, проверяй (через xsl:if) что id обрабатываемого элемента равен id текущей страницы (если делаешь сайт на базе xslt шаблонов с демо магазина umi, то id текущей страницы записывается в глобальную переменную $document-page-id, ей и пользуйся при сравнении) и если равен то чтото дополнительно выводи, например стиль css или еще что
Название: Re:Активный раздел
Отправлено: DZHETIGAPA от 08 Декабря 2011, 21:56:24
Возникла проблема. Если я нахожусь на странице товара, то данный метод не работает. Пытался сделать сам как-то правильно, но не выходит.

Если делать данным методом, то мне нужно определить айдишник родителя товара. Как, зная id страницы товара можно определить id родителя этого товара с помощью функций?

Есть  вариант сделать все обходными путями и костылями, но все же охото правильно.
Название: Re:Активный раздел
Отправлено: admin от 08 Декабря 2011, 23:06:11
для твоего случая нужен вот такой код:

это добавить в файл xsltTpls/default.xsl к уже существующим глобальным переменным
 <xsl:variable name="document-page-parent-id" select="/result/parents" />
   
,а это шаблон, по которому выведется список разделов и подразделов неограниченной вложенности. Развернутым будет только тот раздел, в котором ты находишься или если ты это дочерняя страница по отношению к данному разделу (вне зависимости от вложенности)
	<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>

в принципе кол-во шаблонов можно сократить вдвое, но в том примере что был у меня было разное оформление у первого уровня разделов и у всех остальных
Название: Re:Активный раздел
Отправлено: DZHETIGAPA от 09 Декабря 2011, 02:51:42
Спасибо. Обязательно ознакомлюсь.
Название: Re:Активный раздел
Отправлено: DZHETIGAPA от 09 Декабря 2011, 13:54:11
Есть такой код. Кастомный метод просто выводить класс active. Но почему-то он не работает. В чем может быть дело?

<xsl:if test="(@id=$document-page-id) or (@id=$document-page-parent-id/page/@id)">
<xsl:variable name="id" select="document(concat('udata://custom/is_active_page/', @id))/udata" />
</xsl:if>

<li class="{$id}" umi:element-id="{@id}" umi:region="row">
<span>
<a href="{@link}" umi:field-name="name" umi:delete="delete" umi:empty="empty-section-name;">
                    <xsl:variable name="item" select="." />
<xsl:value-of select="$item" />

</a>
</span>
<xsl:apply-templates select="document(concat('udata://catalog/getCategoryList/void/', @id,'//1'))/udata" mode="left-column" />
</li>
Название: Re:Активный раздел
Отправлено: admin от 09 Декабря 2011, 14:07:08
не знаю ,но опять же интересуюсь зачем вам кастомный метод если вы можете проверять является ли заданный id равен id текущей страницы или равен id родительских страниц используя только xml который отдает вам система при просмотре страницы
Название: Re:Активный раздел
Отправлено: DZHETIGAPA от 09 Декабря 2011, 15:54:29
Мне нужно вывести все подразделы. Пользователь имеет возможность сам открывать нужные ему разделы с помощью скрипта. Для этого в раздел, в котором я нахожусь присваиваю class="active". В активный раздел нужно добавить этот класс. К тому же, раздел, который активен, должен подсвечиваться. поэтому надо присвоить определенный класс разделу.
Название: Re:Активный раздел
Отправлено: admin от 09 Декабря 2011, 16:10:29
это понятно, почему бы это не сделать средствами xslt? чтобы не было лишних запросов

например мы выводим пункты разделы макросом getCategoryList

тогда там где надо выводить список разделов пишем вызов данного макроса

<xsl:apply-templates select="document(concat('udata://catalog/getCategoryList/void/', @id,'//1'))/udata" mode="categoty_list" />

и создаем шаблоны для отрисовки разделов (сделаем рекурсивный вызов чтобы отрисовывались разделы на любом уровне вложенности)

<xsl:template match="udata[@method = 'getCategoryList']" mode="categoty_list">
<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="categoty_list"/>
</ul>
</xsl:template>


<xsl:template match="udata[@method = 'getCategoryList']//item" mode="categoty_list">
<li umi:element-id="{@id}" umi:region="row">
<xsl:if test="@id=$document-page-id">
                                <xsl:attribute name="class" ><xsl:text>active</xsl:text></xsl:attribute>
                        </xsl:if>
                        <a href="{@link}" umi:field-name="name" umi:delete="delete" umi:empty="&empty-section-name;">
<xsl:value-of select="." />
</a>
        <xsl:apply-templates select="document(concat('udata://catalog/getCategoryList/void/', @id))" mode="categoty_list"/>

</li>
</xsl:template>

в последнем шаблоне вот эта конструкция

<xsl:if test="@id=$document-page-id">
                                <xsl:attribute name="class" ><xsl:text>active</xsl:text></xsl:attribute>
                        </xsl:if>

проверяет равенство id элемента который сейчас отрисовывается с id текущей страниц ($document-page-id) и если они равны добавляет к вышестоящему элементу <li> class="active"