UMIhelp

Разработка сайта на UMI.CMS => Шаблоны XSLT => Тема начата: luciuz от 05 Июня 2016, 20:47:18

Название: Два меню
Отправлено: luciuz от 05 Июня 2016, 20:47:18
Всем привет!

Пытаюсь разобраться с xsl-шаблонами, пока выходит не очень. Подскажите, как наиболее грамотно сделать следующее.
Сейчас на сайте меню выводится в двух местах: в шапке (только первый уровень), в сайдбаре (только первый уровень)
с помощью кода
<xsl:apply-templates select="document('udata://content/menu')/udata" />

А хочется, чтобы в шапке показывался только первый уровень, а в сайдбаре -- первый и второй уровень, если это включено в настройках:
(http://s019.radikal.ru/i623/1606/4b/5518d3ae99b8.png)
В идеале, чтобы в каждом меню активным элементам проставлялся класс active

Спасибо
Название: Re: Два меню
Отправлено: aghigay от 05 Июня 2016, 21:04:19
При использовании макроса udata://content/menu/ у него есть параметр - max_depth (http://dev.docs.umi-cms.ru/spravochnik_makrosov_umicms/struktura_i_kontent/content_menu/#content)

В требуемом случае необходимо писать что-то вроде
<xsl:apply-templates select="document('udata://content/menu')/udata" />
верхней части и
<xsl:apply-templates select="document('udata://content/menu//2')/udata" />
в нижней части.

При этом работа с меню осуществляется исходя из результата по документации (http://dev.docs.umi-cms.ru/spravochnik_makrosov_umicms/struktura_i_kontent/content_menu/#xslt-templating&sel=29:23,29:138)

В частности, для верхней части меню будет выглядеть так:
<udata module="content" method="menu" generation-time="0.006117">
  <items>
    <item id="1" link="/" xlink:href="upage://1">Добро пожаловать</item>
    <item id="2" link="/talks/" xlink:href="upage://2">Форум</item>
    <item id="12" link="/vse_novosti/" xlink:href="upage://12">Все новости</item>
    <item id="26" link="/contacts/" xlink:href="upage://26">Обратная связь</item>
    <item id="27" link="/umicms/" xlink:href="upage://27">FAQ</item>
    <item id="33" link="/butterfly/" xlink:href="upage://33">Фотогалерея</item>
    <item id="42" link="/obychnaya_stranica/" xlink:href="upage://42">Обычная страница</item>
    <item id="43" link="/market/" xlink:href="upage://43" status="active">Каталог товаров</item>
  </items>
</udata>

А для нижней например так:
<udata module="content" method="menu" generation-time="0.006117">
  <items>
    <item id="1" link="/" xlink:href="upage://1">
      <items>
        <item id="1" link="/" xlink:href="upage://1">Добро пожаловать</item>
        <item id="2" link="/talks/" xlink:href="upage://2">Форум</item>
        <item id="12" link="/vse_novosti/" xlink:href="upage://12">Все новости</item>
        <item id="26" link="/contacts/" xlink:href="upage://26">Обратная связь</item>
        <item id="27" link="/umicms/" xlink:href="upage://27">FAQ</item>
        <item id="33" link="/butterfly/" xlink:href="upage://33">Фотогалерея</item>
        <item id="42" link="/obychnaya_stranica/" xlink:href="upage://42">Обычная страница</item>
        <item id="43" link="/market/" xlink:href="upage://43">Каталог товаров</item>
      </items>
      Добро пожаловать
    </item>
    <item id="2" link="/talks/" xlink:href="upage://2">Форум</item>
    <item id="12" link="/vse_novosti/" xlink:href="upage://12">Все новости</item>
    <item id="26" link="/contacts/" xlink:href="upage://26">Обратная связь</item>
    <item id="27" link="/umicms/" xlink:href="upage://27">FAQ</item>
    <item id="33" link="/butterfly/" xlink:href="upage://33">Фотогалерея</item>
    <item id="42" link="/obychnaya_stranica/" xlink:href="upage://42">Обычная страница</item>
    <item id="43" link="/market/" xlink:href="upage://43" status="active">Каталог товаров</item>
  </items>
</udata>

При этом у выделенного пункта и его родительских пунктов будет стоять аттрибут status="active". Исходя из его наличия можно проверять простановку активного элемента.
Название: Re: Два меню
Отправлено: luciuz от 05 Июня 2016, 21:46:29
Спасибо. Верхнее меню работает как положено.
Однако есть некоторые ошибки в боковом: вместо текста ссылки родительского элемента, мы видим РодительПотомок???

<ul>
<li><a href="/one">Уровень1</a></li>
<li><a href="/two" class="active">Уровень1Уровень2</a>
<ul class="sub_menu"><li><a href="/hello">Уровень2</a></li></ul>
</li>
<li><a href="/three">Уровень1</a></li>
</ul>

Для меню прописал такие шаблоны
<xsl:template match="udata[@module = 'content'][@method = 'menu']">
<ul>
<!--  здесь мы выведем отдельные элементы списка  -->
<xsl:apply-templates select="items" mode="menu"/>
</ul>
</xsl:template>

<xsl:template match="item[@status = 'active']" mode="menu">
<li>
<a href="{@link}" class="active">
<!-- выводим название страницы - содержимое item -->
<xsl:value-of select="." />
</a>
<xsl:apply-templates select="items" mode="sub_menu"/>
</li>
</xsl:template>

<xsl:template match="item" mode="menu">
<li>
<a href="{@link}">
<!-- выводим название страницы - содержимое item -->
<xsl:value-of select="." />
</a>
<xsl:apply-templates select="items" mode="sub_menu"/>
</li>
</xsl:template>


<xsl:template match="items" mode="sub_menu">
<ul class="sub_menu">
<xsl:apply-templates select="item" mode="menu"/>
</ul>
</xsl:template>
Название: Re: Два меню
Отправлено: aghigay от 05 Июня 2016, 21:50:02
Хм... Если потомок находится внутри родителя, то и ссылка на него выглядит как /родитель/потомок

А как иначе?

Если есть желание организовать структуру меню, отличную от структуры дерева, нужно брать модуль меню: http://dev.docs.umi-cms.ru/spravochnik_makrosov_umicms/menu/menu_draw/
Название: Re: Два меню
Отправлено: luciuz от 05 Июня 2016, 21:53:08
Такое ощущение, что в заголовок родителя он тупо все внутренние заголовки запихал.
Название: Re: Два меню
Отправлено: aghigay от 05 Июня 2016, 21:56:55
Аааа, если речь про текст внутри - то конечно, при использовании оператора [.] xslt пытается представить весь результат, который только может представить, в виде текста. А значит он берет все, в том числе и содержимое дочерних тегов.

Чтобы такого не было - нужно использовать оператор text() или node()
Речь вот об этом
<a href="{@link}" class="active">
  <xsl:value-of select="." />
</a>
Название: Re: Два меню
Отправлено: aghigay от 05 Июня 2016, 21:57:27
Должно быть так
<a href="{@link}" class="active">
  <xsl:value-of select="text()" />
</a>
Название: Re: Два меню
Отправлено: luciuz от 05 Июня 2016, 22:00:35
Браво!!!  ;D