Курс 2016 года “Разработка на UMI.CMS от 0 до готового сайта”
Не выводится дополнительное меню в версии "Start"

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

Ответов: 4
Просмотров: 2208
Последний ответ 10 Январь 2013, 10:08:04
от admin
Магазин "Современный" - добавление заголовка к левому меню каталога

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

Ответов: 4
Просмотров: 2080
Последний ответ 25 Июнь 2012, 17:33:00
от manadsgn
Вывод страницы в меню с отключением вывода в карте сайта

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

Ответов: 6
Просмотров: 3634
Последний ответ 03 Ноябрь 2011, 15:07:29
от alpotemkin
Текущая страница - добавление класса к ссылке главного меню

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

Ответов: 2
Просмотров: 1803
Последний ответ 24 Июнь 2012, 14:00:10
от manadsgn
Вывод в меню только разделов с определенными свойствами

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

Ответов: 4
Просмотров: 3653
Последний ответ 24 Июнь 2011, 12:58:58
от polo

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

*

luciuz

  • *
  • 7
  • +0/-0
    • Просмотр профиля
Два меню
« : 05 Июнь 2016, 20:47:18 »
Всем привет!

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

А хочется, чтобы в шапке показывался только первый уровень, а в сайдбаре -- первый и второй уровень, если это включено в настройках:

В идеале, чтобы в каждом меню активным элементам проставлялся класс active

Спасибо
« Последнее редактирование: 05 Июнь 2016, 20:49:57 от luciuz »

*

aghigay

  • *****
  • 611
  • +28/-3
  • Просто пытаюсь помочь. Иногда пинком
    • Просмотр профиля
    • umicms.me
Re: Два меню
« Ответ #1 : 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". Исходя из его наличия можно проверять простановку активного элемента.
Мой блог http://umicms.me

*

luciuz

  • *
  • 7
  • +0/-0
    • Просмотр профиля
Re: Два меню
« Ответ #2 : 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>

*

aghigay

  • *****
  • 611
  • +28/-3
  • Просто пытаюсь помочь. Иногда пинком
    • Просмотр профиля
    • umicms.me
Re: Два меню
« Ответ #3 : 05 Июнь 2016, 21:50:02 »
Хм... Если потомок находится внутри родителя, то и ссылка на него выглядит как /родитель/потомок

А как иначе?

Если есть желание организовать структуру меню, отличную от структуры дерева, нужно брать модуль меню: http://dev.docs.umi-cms.ru/spravochnik_makrosov_umicms/menu/menu_draw/
Мой блог http://umicms.me

*

luciuz

  • *
  • 7
  • +0/-0
    • Просмотр профиля
Re: Два меню
« Ответ #4 : 05 Июнь 2016, 21:53:08 »
Такое ощущение, что в заголовок родителя он тупо все внутренние заголовки запихал.

*

aghigay

  • *****
  • 611
  • +28/-3
  • Просто пытаюсь помочь. Иногда пинком
    • Просмотр профиля
    • umicms.me
Re: Два меню
« Ответ #5 : 05 Июнь 2016, 21:56:55 »
Аааа, если речь про текст внутри - то конечно, при использовании оператора [.] xslt пытается представить весь результат, который только может представить, в виде текста. А значит он берет все, в том числе и содержимое дочерних тегов.

Чтобы такого не было - нужно использовать оператор text() или node()
Речь вот об этом
<a href="{@link}" class="active">
  <xsl:value-of select="." />
</a>
Мой блог http://umicms.me

*

aghigay

  • *****
  • 611
  • +28/-3
  • Просто пытаюсь помочь. Иногда пинком
    • Просмотр профиля
    • umicms.me
Re: Два меню
« Ответ #6 : 05 Июнь 2016, 21:57:27 »
Должно быть так
<a href="{@link}" class="active">
  <xsl:value-of select="text()" />
</a>
Мой блог http://umicms.me

*

luciuz

  • *
  • 7
  • +0/-0
    • Просмотр профиля
Re: Два меню
« Ответ #7 : 05 Июнь 2016, 22:00:35 »
Браво!!!  ;D