Курс 2016 года “Разработка на UMI.CMS от 0 до готового сайта”
При переносе раздела в структуре сайта, сломался раздел

Автор lexar0708Раздел Макросы UMI.CMS

Ответов: 3
Просмотров: 2434
Последний ответ 15 Декабря 2017, 13:34:41
от admin
Не разворачивается определенный раздел в структуре сайта

Автор mrdubellРаздел Наполнение сайтов

Ответов: 6
Просмотров: 3409
Последний ответ 15 Апреля 2015, 14:38:09
от mrdubell
Заблокированный раздел структура

Автор vkolesovРаздел Настройка системы и модулей

Ответов: 7
Просмотров: 3673
Последний ответ 16 Января 2014, 17:03:09
от vkolesov
Раздел бренда каталог

Автор webtrendРаздел Шаблоны XSLT

Ответов: 16
Просмотров: 3760
Последний ответ 15 Ноября 2016, 22:43:40
от aghigay
Развернутый только активный пункт меню

Автор WenLeksРаздел Настройка системы и модулей

Ответов: 1
Просмотров: 1724
Последний ответ 27 Сентября 2014, 14:11:03
от admin

0 Пользователей и 1 Гость просматривают эту тему.

*

DZHETIGAPA

  • **
  • 79
  • +0/-0
    • Просмотр профиля
Активный раздел
« : 06 Декабря 2011, 01:38:43 »
Сделал вывод левого меню каталога. Как определить активный раздел? То есть раздел, в котором я нахожусь, должен подсвечиваться в левом меню

Как такое можно реализовать?

*

DZHETIGAPA

  • **
  • 79
  • +0/-0
    • Просмотр профиля
Re:Активный раздел
« Ответ #1 : 06 Декабря 2011, 01:50:42 »

*

admin

  • *****
  • 2444
  • +172/-1
    • Просмотр профиля
Re:Активный раздел
« Ответ #2 : 06 Декабря 2011, 21:03:10 »
если используешь xslt, то этот кастомный макрос лишние телодвижения создает.

При выводе разделов слева, проверяй (через xsl:if) что id обрабатываемого элемента равен id текущей страницы (если делаешь сайт на базе xslt шаблонов с демо магазина umi, то id текущей страницы записывается в глобальную переменную $document-page-id, ей и пользуйся при сравнении) и если равен то чтото дополнительно выводи, например стиль css или еще что

*

DZHETIGAPA

  • **
  • 79
  • +0/-0
    • Просмотр профиля
Re:Активный раздел
« Ответ #3 : 08 Декабря 2011, 21:56:24 »
Возникла проблема. Если я нахожусь на странице товара, то данный метод не работает. Пытался сделать сам как-то правильно, но не выходит.

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

Есть  вариант сделать все обходными путями и костылями, но все же охото правильно.

*

admin

  • *****
  • 2444
  • +172/-1
    • Просмотр профиля
Re:Активный раздел
« Ответ #4 : 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>

в принципе кол-во шаблонов можно сократить вдвое, но в том примере что был у меня было разное оформление у первого уровня разделов и у всех остальных

*

DZHETIGAPA

  • **
  • 79
  • +0/-0
    • Просмотр профиля
Re:Активный раздел
« Ответ #5 : 09 Декабря 2011, 02:51:42 »
Спасибо. Обязательно ознакомлюсь.

*

DZHETIGAPA

  • **
  • 79
  • +0/-0
    • Просмотр профиля
Re:Активный раздел
« Ответ #6 : 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>

*

admin

  • *****
  • 2444
  • +172/-1
    • Просмотр профиля
Re:Активный раздел
« Ответ #7 : 09 Декабря 2011, 14:07:08 »
не знаю ,но опять же интересуюсь зачем вам кастомный метод если вы можете проверять является ли заданный id равен id текущей страницы или равен id родительских страниц используя только xml который отдает вам система при просмотре страницы

*

DZHETIGAPA

  • **
  • 79
  • +0/-0
    • Просмотр профиля
Re:Активный раздел
« Ответ #8 : 09 Декабря 2011, 15:54:29 »
Мне нужно вывести все подразделы. Пользователь имеет возможность сам открывать нужные ему разделы с помощью скрипта. Для этого в раздел, в котором я нахожусь присваиваю class="active". В активный раздел нужно добавить этот класс. К тому же, раздел, который активен, должен подсвечиваться. поэтому надо присвоить определенный класс разделу.

*

admin

  • *****
  • 2444
  • +172/-1
    • Просмотр профиля
Re:Активный раздел
« Ответ #9 : 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"