Курс 2016 года “Разработка на UMI.CMS от 0 до готового сайта”
Группировка item в выборке?

Автор muldyРаздел Custom макросы

Ответов: 4
Просмотров: 1489
Последний ответ 16 Января 2014, 11:42:46
от muldy
Изменение вывода list-position (TPL)

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

Ответов: 1
Просмотров: 1209
Последний ответ 29 Сентября 2012, 18:44:15
от technoexpert

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

*

Babajka

  • *
  • 42
  • +0/-0
    • Просмотр профиля
Position в выборке
« : 20 Марта 2013, 11:48:29 »
Здравсвуйте. На сайте находится несколько меню.
Распределение их происходит с помощью выборки из content menu определенных пунктов меню с метками, в этом случае bottom_menu.
Мне необходимо первому тэгу li присвоить класс first.
Но он не присваевается.
Собственно код:

<xsl:apply-templates select="document('udata://content/menu/')/udata" mode="bottom_menu"/>
<xsl:template match="udata[@method = 'menu']" mode="bottom_menu">
<ul >
<xsl:apply-templates select="items/item" mode="bottom_menu" />
</ul>
</xsl:template>

<xsl:template match="item" mode="bottom_menu">
<xsl:variable name="test" select="document(concat('upage://',@id, '.bottom_menu'))/udata/property/value" />
<xsl:if test="$test !=0">
<li>
<xsl:if test="position() = 1"><!-- тут и закрывается ошибка -->
<xsl:attribute name="class">first</xsl:attribute>
</xsl:if>
<a href="{@link}" >
<xsl:value-of select="." />
</a>
</li>
</xsl:if>
</xsl:template>

Собстенно, если заменить position()=1 на 6(т.к. это 6 пункт меню в админке). То все работает. Но это временная мера.
И сам вопрос: Как это сделать более красиво, что ли. Что бы, если в будущем добавлю еще пунктов меню, не расползлось все.

*

Rodogor

  • ***
  • 189
  • +24/-0
    • Просмотр профиля
Re:Position в выборке
« Ответ #1 : 20 Марта 2013, 13:25:39 »
1. может быть заюзать css li:first-child ?
2. Так вроде всё достаточно красиво, причина не ясна.
Надо попробывать вывести position <xsl:value-of select="position()"/> и смотреть какие цифры, может =1 там не появляется. Такое может быть, если выше были ошибки с xslt

*

admin

  • *****
  • 2419
  • +172/-1
    • Просмотр профиля
Re:Position в выборке
« Ответ #2 : 20 Марта 2013, 17:26:07 »
class не присваивается, так как первый item, скорее всего, просто не прошел проверку
<xsl:if test="$test !=0">
, а остальные уже не первые...

Так что вижу тут 2 варианта

1. Добавляете информацию из поля bottom_menu в xml который возвращает макрос content menu и правильно формируете вызов при переборе item.
То есть вызов выглядит так:
<xsl:apply-templates select="document('udata://content/menu/?extProps=bottom_menu')/udata" mode="bottom_menu"/>

а шаблоны для вывода так:
<xsl:template match="udata[@method = 'menu']" mode="bottom_menu">
<ul >
<xsl:apply-templates select="items/item[not(//property[@name='bottom_menu']/value=0)]" mode="bottom_menu" />
</ul>
</xsl:template>

<xsl:template match="item" mode="bottom_menu">
<li>
<xsl:if test="position() = 1"><!-- тут и закрывается ошибка -->
<xsl:attribute name="class">first</xsl:attribute>
</xsl:if>
<a href="{@link}" >
<xsl:value-of select="." />
</a>
</li>
</xsl:template>

Этот вариант, к тому же, немного сократить потребность в ресурсах, при выводе меню

2. Используете usel выборку вместо content menu макроса. И там прописываете условие, что вас интересуют страницы с отмеченной галочкой bottom_menu. Пример, создание альтернативного меню, используя usel описан в этой статье http://umihelp.ru/articles/usel-multilevel-menu/

*

Babajka

  • *
  • 42
  • +0/-0
    • Просмотр профиля
Re:Position в выборке
« Ответ #3 : 21 Марта 2013, 09:52:13 »
Воспользовался я первым вариантом. Но, результат оказался непредсказуемый. Класс first присвоился, но меню вывелось просто 6 первых меню. Т.е. даже не обращая внимания на флажок bottom_menu или top_menu.

*

admin

  • *****
  • 2419
  • +172/-1
    • Просмотр профиля
Re:Position в выборке
« Ответ #4 : 21 Марта 2013, 10:38:23 »
возможно, у меня в шаблоне есть неточности, писал сразу на форум без проверки синтаксиса. Так же, стоит проверить версию umi и работает ли у вас возможность получать extProps

*

niakriss

  • ***
  • 190
  • +2/-0
    • Просмотр профиля
Re:Position в выборке
« Ответ #5 : 29 Марта 2013, 15:27:02 »
а нельзя просто 2 шаблона написать для 1го и для всех остальных?
На сколько я слышала, рекоммендуют лучше шаблонами обойтись, нежели операторами условия.

<xsl:template match="udata[@method = 'menu']" mode="bottom_menu">
<ul >
<xsl:apply-templates select="items/item[not(//property[@name='bottom_menu']/value=0)]" mode="bottom_menu" />
</ul>
</xsl:template>

<xsl:template match="item" mode="bottom_menu">
<li>
<a href="{@link}" >
<xsl:value-of select="." />
</a>
</li>
</xsl:template>
<xsl:template match="item[1]" mode="bottom_menu">
<li class="fist">
<a href="{@link}" >
<xsl:value-of select="." />
</a>
</li>
</xsl:template>

*

Babajka

  • *
  • 42
  • +0/-0
    • Просмотр профиля
Re:Position в выборке
« Ответ #6 : 03 Апреля 2013, 14:44:22 »
niakriss
Попробовал ваш пример. Не вышло, выводит просто основное меню и ничего больше.
И еще вопрос
<xsl:apply-templates select="items/item[not(//property[@name='bottom_menu']/value=0)]" mode="bottom_menu" />
Чем нибудь отличается от
<xsl:apply-templates select="items/item[(//property[@name='bottom_menu']/value=1)]" mode="bottom_menu" />
?
« Последнее редактирование: 03 Апреля 2013, 15:34:31 от Babajka »

*

admin

  • *****
  • 2419
  • +172/-1
    • Просмотр профиля
Re:Position в выборке
« Ответ #7 : 04 Апреля 2013, 07:35:14 »
перепроверил еще раз уже на рабочем варианте. вместо вашей галочки bottom_menu использовал галочку  robots_deny ("Запретить индексацию поисковиками"), то есть к двум из пунктам меню я добавил данную галочку и в итоге получал список из этих двух пунктов при том что position() возвращал в их случае 1 и 2 (то есть вопрос с выводом класса first тоже решался)

Привожу копию шаблонов

Вызов:
<xsl:apply-templates select="document('udata://content/menu/?extProps=robots_deny')" mode="new_menu" />

шаблоны меню:
<xsl:template match="udata[@method = 'menu']" mode="new_menu">
<ul umi:element-id="0" umi:module="content" umi:region="list" umi:sortable="sortable" umi:add-method="popup">
<xsl:apply-templates select="items/item[.//property[@name='robots_deny']/value=1]" mode="new_menu" />
</ul>
</xsl:template>

<xsl:template match="item" mode="new_menu">
<li>
<a href="{@link}" umi:element-id="{@id}" umi:region="row" umi:field-name="name" umi:empty="&empty-section-name;" umi:delete="delete">
~<xsl:value-of select="position()" />~
<xsl:value-of select="text()" />
</a>
</li>
</xsl:template>


P.S. едиственное что поменялось в шаблоне, это синтаксис условия выборки item
items/item[.//property[@name='robots_deny']/value=1]
видимо в нем и была ошибка

*

admin

  • *****
  • 2419
  • +172/-1
    • Просмотр профиля
Re:Position в выборке
« Ответ #8 : 04 Апреля 2013, 07:42:58 »
niakriss
а нельзя просто 2 шаблона написать для 1го и для всех остальных?
На сколько я слышала, рекоммендуют лучше шаблонами обойтись, нежели операторами условия.

Можно и в большинстве случаев именно так я и делаю и рекомендую делать слушателям курсов, но <xsl:if /> все равно продолжаю использовать.Например, в ситуации, когда мне надо добавить класс в верстку в зависимости от позиции элемента в xml документе (особенно если их несколько, например класс для первого, для последнего, для четного). В этом случае удобнее делать это в одном шаблоне иначе сэкономив на быстроте выполнении той или иной организации шаблона, вы можете потерять в скорости обработки из-за возрастания количества шаблонов.

*

Babajka

  • *
  • 42
  • +0/-0
    • Просмотр профиля
Re:Position в выборке
« Ответ #9 : 05 Апреля 2013, 17:49:01 »
Если я ничего не "навертел" в коде
	<xsl:template match="udata[@method = 'menu']" mode="bottom_menu">
<ul umi:element-id="0" umi:module="content" umi:region="list" umi:sortable="sortable" umi:add-method="popup">
<xsl:apply-templates select="items/item[.//property[@name='bottom_menu']/value=1]" mode="bottom_menu" />
</ul>
</xsl:template>

<xsl:template match="item" mode="bottom_menu">
<li>
<xsl:if test="position() = 1">
<xsl:attribute name="class">first</xsl:attribute>
</xsl:if>
<a href="{@link}" >
<xsl:value-of select="." />
</a>
</li>
</xsl:template>
то у меня непобедимый сайт. Все равно не выводит.

*

admin

  • *****
  • 2419
  • +172/-1
    • Просмотр профиля
Re:Position в выборке
« Ответ #10 : 05 Апреля 2013, 20:14:29 »
шаблон вроде верный, а вы проверяли срабатывает ли у вас параметр ?extProps. то есть пробовали посмотреть через <xsl:copy-of select="document('udata://content/menu/?extProps=robots_deny')" mode="new_menu" /> выводит ли система доп поля?

*

Babajka

  • *
  • 42
  • +0/-0
    • Просмотр профиля
Re:Position в выборке
« Ответ #11 : 08 Апреля 2013, 16:27:26 »
шаблон вроде верный, а вы проверяли срабатывает ли у вас параметр ?extProps. то есть пробовали посмотреть через <xsl:copy-of select="document('udata://content/menu/?extProps=robots_deny')" mode="new_menu" /> выводит ли система доп поля?
Все выяснил, версия не дотягивает.

Из размышлений
<xsl:apply-templates select="items/item[not(//property[@name='bottom_menu']/value=0)]" mode="bottom_menu" />
У bottom_menu нет значения 0. Если он вообще присутствует то value=1, при отсутствии самого property нет.
« Последнее редактирование: 08 Апреля 2013, 16:54:50 от Babajka »

*

e.ioffe

  • ****
  • 368
  • +80/-2
  • Профессиональная разработка на UMI.CMS.
    • Просмотр профиля
    • Fullspace - Лучший хостинг для UMI.CMS
Re:Position в выборке
« Ответ #12 : 08 Апреля 2013, 17:15:16 »
Можно и в большинстве случаев именно так я и делаю и рекомендую делать слушателям курсов, но <xsl:if /> все равно продолжаю использовать.Например, в ситуации, когда мне надо добавить класс в верстку в зависимости от позиции элемента в xml документе (особенно если их несколько, например класс для первого, для последнего, для четного). В этом случае удобнее делать это в одном шаблоне иначе сэкономив на быстроте выполнении той или иной организации шаблона, вы можете потерять в скорости обработки из-за возрастания количества шаблонов.

Вставлю свои 5 копеек :) If использую в редких случаях, когда, например, нужно проверить, есть ли в корзине товары, но при этом не хочется городить дополнительные template.

Обычно класс для элемента вставляю с помощью конструкции (если уверен, что класс будет в любом случае)

<li>
<xsl:attribute name="class"><xsl:apply-templates select="." mode="additional-class" /></xsl:attribute>
</li>

<xsl:template macth="item[first()]" mode="additional-class">first</xsl:template>

<xsl:template macth="item[last()]" mode="additional-class">last</xsl:template>

Или, если в некоторых случаях класс не нужен, то:

<li>
<xsl:apply-templates select="." mode="additional-class" />
</li>

<xsl:template macth="item" mode="additional-class" />

<xsl:template macth="item[first()]" mode="additional-class">
<xsl:attribute name="class">first</xsl:attribute>
</xsl:template>
Ускорение сайта на UMI.CMS - http://speed.umispec.ru/

*

Babajka

  • *
  • 42
  • +0/-0
    • Просмотр профиля
Re:Position в выборке
« Ответ #13 : 21 Мая 2013, 12:12:38 »
e.ioffe
Ничего более здравого не придумал, в прменении твоего примера. Хотя сам понимаю, что код бредовый.
Кто нибудь может подсказать, что именно не так и как сделать чтобы было так?
 	<xsl:template match="udata[@method = 'menu']" mode="bottom_menu">
<ul >
<xsl:apply-templates select="items/item" mode="bottom_menu" />
</ul>
</xsl:template>

<xsl:template match="item" mode="bottom_menu">
<xsl:variable name="test" select="document(concat('upage://',@id, '.bottom_menu'))/udata/property/value" />
<xsl:if test="$test !=0">
<xsl:apply-templates select="." mode="additional-class" />
</xsl:if>
</xsl:template>

<xsl:template macth="item" mode="additional-class" >
<li>
<a href="{@link}" ><xsl:value-of select="." /></a>
</li>
</xsl:template>

<xsl:template macth="item[first()]" mode="additional-class">
<li>
<xsl:attribute name="class">first</xsl:attribute>
<a href="{@link}" ><xsl:value-of select="." /></a>
</li>
</xsl:template>

*

admin

  • *****
  • 2419
  • +172/-1
    • Просмотр профиля
Re:Position в выборке
« Ответ #14 : 21 Мая 2013, 12:23:35 »
может уже ну его, через макрос menu, может через usel попробовать? там при выборке сразу можно будет поставить проверку на это поле bottom_menu

P.S. Кстати, этот то вариант работает?