UMIhelp

Разработка сайта на UMI.CMS => Шаблоны XSLT => Тема начата: muldy от 04 Марта 2013, 15:32:40

Название: Раскрывающеся меню из категорий
Отправлено: muldy от 04 Марта 2013, 15:32:40
Здравствуйте, встала не очевидная задча формирования меню!
Есть каталог, который выглядет так:

Раздел 1
Раздел 2
Раздел 3
Раздел 4
и т.д.

Все четыре или более пукнтов должны быть объедены в список, т.е так:
<ul>
Имя пункта
<ul>
<li>Раздел 1</li>
<li>Раздел 2</li>
<li>Раздел 3</li>
<ul>
Имя пункта
<ul>
<li>Раздел 4</li>
<li>Раздел 5</li>
<li>Раздел 6</li>
<ul>
</ul>

Не могу разобратся, станадартными методами не получается, т.к все разделы начинаются от корня сайта
Пробывал задавать каждому элменту свои шаблоны, но как оказалось все равно не получается!
Подскажите как можно реализовать подобную задачу????
Название: Re:Раскрывающеся меню из категорий
Отправлено: BaceH от 05 Марта 2013, 02:02:10
Цитировать
т.к все разделы начинаются от корня сайта
все это какие? внутренние разделы тоже от корня сайта?
как пытаетесь вывести? получается ли вывести первый уровень?
покажите шаблон :)
Название: Re:Раскрывающеся меню из категорий
Отправлено: Rodogor от 05 Марта 2013, 09:20:27
Что нам нужно, что бы это сделать:
0. Найти как получать меню ( content::menu )
1. Получить список разделов верхней категории
2. Для каждого элемента верхней категории получить вложенные

К примеру, разделы у нас лежат в корне сайта.

Получаем верхнии категории:

<xsl:apply-template select="document('udata://content/menu')/udata/items" mode="my_menu"/>

Пишем шаблон для обработки верхних категорий. Я обычно делаю шаблоны с учётом случая, что элементов может не быть и выводить ничего не придётся, поэтому делаю так:

<xsl:template match="items" mode="my_menu">
<ul>
<xsl:apply-templates select="item" mode="my_menu"/>
</ul>
</xsl:template>
Если есть items, значит элементы есть и надо создать <ul/>

Теперь выводим элементы меню верхней категории.  К этому моменты мы вернёмся ещё, поэтому пометим его (1)

<xsl:template match="item" mode="my_menu">
<li><a href="@link"><xsl:value-of select="."/></a></li>
</xsl:template>
Мы вывели меню в таком виде:
<ul>
<li><a href="link1">ВерхнийРаздел1</a></li>
<li><a href="link2">ВерхнийРаздел2</a></li>
<li><a href="link3">ВерхнийРаздел3</a></li>
<li><a href="link4">ВерхнийРаздел4</a></li>
</ul>

Для каждого элемента верхнего раздела нужно вывести дочерние. Воспользуемся ещё раз content::menu и вернёмся к листингу (1), слегка изменив его

<xsl:template match="item" mode="my_menu">
<li>
<a href="@link"><xsl:value-of select="."/></a>
<xsl:apply-template select="document(concat('udata://menu/content///',@id))/udata.item" mode="inner_menu"/>
</li>
</xsl:template>

Теперь опишем шаблон для вывода внутренних разделов меню.
<xsl:template match="items" mode="inner_menu">
<ul>
<xsl:apply-templates select="item" mode="inner_menu"/>
</ul>
</xsl:template>

<xsl:template match="item" mode="inner_menu">
<li><a href="@link"><xsl:value-of select="."/></a></li>
</xsl:template>

Код не проверял, фигачил прям так.

Решение этой задачей является базовой для понимания xslt и базовой для понимания работы с макросами umi
Название: Re:Раскрывающеся меню из категорий
Отправлено: BaceH от 05 Марта 2013, 23:58:15
при построении меню каталога лучше воспользоваться getcategorylist
udata://catalog/getCategoryList/notemplate/(ид_раздела)/100
в дальнейшем все также.
исходя из приведенной верстки, внутреннее меню можно строить тем же шаблоном что и первый уровень.
Название: Re:Раскрывающеся меню из категорий
Отправлено: muldy от 06 Марта 2013, 13:07:30
Что нам нужно, что бы это сделать:
0. Найти как получать меню ( content::menu )
1. Получить список разделов верхней категории
2. Для каждого элемента верхней категории получить вложенные

К примеру, разделы у нас лежат в корне сайта.

Получаем верхнии категории:

<xsl:apply-template select="document('udata://content/menu')/udata/items" mode="my_menu"/>

Пишем шаблон для обработки верхних категорий. Я обычно делаю шаблоны с учётом случая, что элементов может не быть и выводить ничего не придётся, поэтому делаю так:

<xsl:template match="items" mode="my_menu">
<ul>
<xsl:apply-templates select="item" mode="my_menu"/>
</ul>
</xsl:template>
Если есть items, значит элементы есть и надо создать <ul/>

Теперь выводим элементы меню верхней категории.  К этому моменты мы вернёмся ещё, поэтому пометим его (1)

<xsl:template match="item" mode="my_menu">
<li><a href="@link"><xsl:value-of select="."/></a></li>
</xsl:template>
Мы вывели меню в таком виде:
<ul>
<li><a href="link1">ВерхнийРаздел1</a></li>
<li><a href="link2">ВерхнийРаздел2</a></li>
<li><a href="link3">ВерхнийРаздел3</a></li>
<li><a href="link4">ВерхнийРаздел4</a></li>
</ul>

Для каждого элемента верхнего раздела нужно вывести дочерние. Воспользуемся ещё раз content::menu и вернёмся к листингу (1), слегка изменив его

<xsl:template match="item" mode="my_menu">
<li>
<a href="@link"><xsl:value-of select="."/></a>
<xsl:apply-template select="document(concat('udata://menu/content///',@id))/udata.item" mode="inner_menu"/>
</li>
</xsl:template>

Теперь опишем шаблон для вывода внутренних разделов меню.
<xsl:template match="items" mode="inner_menu">
<ul>
<xsl:apply-templates select="item" mode="inner_menu"/>
</ul>
</xsl:template>

<xsl:template match="item" mode="inner_menu">
<li><a href="@link"><xsl:value-of select="."/></a></li>
</xsl:template>

Код не проверял, фигачил прям так.

Решение этой задачей является базовой для понимания xslt и базовой для понимания работы с макросами umi

Этот вариант базовый, он понятен, но суть в том что у меня нет вложенных разделов!

Я решил задачу с помощью usel протокола!
Если надо могу поделиться своим способом!

Название: Re:Раскрывающеся меню из категорий
Отправлено: admin от 09 Марта 2013, 10:54:38

Я решил задачу с помощью usel протокола!
Если надо могу поделиться своим способом!


опишите конечно, может сейчас и не надо никому, но все равно лишним не будет
Название: Re:Раскрывающеся меню из категорий
Отправлено: muldy от 15 Марта 2013, 16:28:25
Имеем разделы от корня сайта:
- Телевизоры SOny -15"
   - Товар
   - Товар
   - Товар
- Телевизоры SOny -20"
   - Товар
   - Товар
   - Товар
- Телевизоры SOny -25"
   - Товар
   - Товар
   - Товар

Требуется вывести все разделы в меню под общим именем, не разделом просто пунктом: Телевизоры.

Чтобы получить подобное меню:
<ul>
<li><a href="">Sony</a>
<ul><li><a href="">Телевизоры SOny -15"</a></li>
<li><a href="">Телевизоры SOny- 20"</a></li>
и т.д.
<ul>
<li>
</ul>
Идем в редактирование шаблона данных "Раздел каталога". Добавляем поле, заголовок - Телевизоры.


Создаем шаблон usel выборки вида:

<?xml version="1.0" encoding="utf-8"?>
<selection>
   <target result="pages">
      <type id="77" />
   </target>
   <property name="{1}" value="1" />
   <limit page="0">40</limit>
</selection>

Где id=77 это шаблон раздела каталога.

В шаблоне данных создаем новое поле имя - Sony, которое будет относится к конкретной категории.

Вызываем меню:
<xsl:apply-templates select="document('usel://left_menu/sony')/udata" mode="menu_usel"/>

Далее обрабатываем шаблон:

<xsl:template match="udata" mode="testov_menu">
      <xsl:variable name="tes_id" select="page/@id" />
       <xsl:variable name="page_sony" select="document(concat('upage://', page/@id))//property[@name = 'podmenyu_tip_tovarov']/value/item/@id" />
       <xsl:variable name="ugud" select="document('usel://guide/132')/udata/item/id"/>
       <xsl:variable name="item_id" select="document('usel://ch_page/')/item/@id" />
       <xsl:apply-templates select="document('usel://guide/132')/udata/item" mode="newest1"/>
       <xsl:apply-templates select="total"/>
   </xsl:template>

Далее в принципе можно обработать стандартно вызов!