Курс 2016 года “Разработка на UMI.CMS от 0 до готового сайта”

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

*

polo

  • *
  • 19
  • +0/-0
    • Просмотр профиля
Привет, мир.

Я тут замыслил такую задачу.
Есть некий набор услуг, часть из которых являются второстепенными. Необходимо создать 2 меню. В первом будут основные услуги, во втором - второстепенные.
Причем желательно все услуги помещать в один раздел в Структуре сайта (в админке).

Я сделал так:
1. Добавил к объекту услуги чекбокс secondary.
2. В месте вызова первого меню:
<xsl:apply-templates select="document('udata://content/menu/0/2/(napravlenia)')/udata" mode="vertical_menu"/>
где napravlenia - Раздел каталога Услуги
3. Шаблон:
	  <xsl:template match="udata[@module = 'content'][@method = 'menu']" mode="vertical_menu">
<ul>
  <xsl:apply-templates select="items/item" mode="vertical_menu"/>
</ul>
  </xsl:template>

  <!-- шаблон для пункта Верт.меню -->
  <xsl:template match="item" mode="vertical_menu">
<li>
  <a href="{@link}">
<xsl:value-of select="@name"/>
  </a>
</li>
  </xsl:template>
4. А дальше пошло затруднение. Понятно, что со второстепенным меню надо по аналогии поступать, только выводить лишь те объекты, у которых галочка secondary поставлена. Так как мне проверить на ее наличие? Только без if и прочей логики...

Спасибо всем, кто задумается.

*

admin

  • *****
  • 2444
  • +172/-1
    • Просмотр профиля
либо вы ставите проверку в момент вывода элемента, но вы написали что без if и это правильно с точки зрения оптимизации нагрузки,

либо вы выводите меню не макросом  document('udata://content/menu/... , а по протоколу usel, который будет выводить все страницы с галочкой "secondary", можно добавить условия что изначально будет искать только в страницах определенного типа или внутри определенной категории.

Описание протокола usel http://help-dev.umi-cms.ru/chapter.XSLTTemplates.usel.html

*

polo

  • *
  • 19
  • +0/-0
    • Просмотр профиля
Спасибо за ответ.
Решил пока не париться с Usel (рано мне еще )) и сделал через if.

Правда, вот в доках видел пример, что можно указать проверку на наличие свойства в объекте вот так:
<xsl:template match="result[//property[@name='my_property]]">
<p>Страница со свойством my_property </p>
</xsl:template>
Но адаптировать к моему случаю с меню так и не осилил.
« Последнее редактирование: 23 Июня 2011, 12:12:25 от polo »

*

admin

  • *****
  • 2444
  • +172/-1
    • Просмотр профиля
насчет usel... в последнее время многие говорят о том, что он не так прост как хотелось бы, надо как-то прояснять этот момент, так как механизм очень мощный и прекрасный.

насчет варианта фильтровать список средствами xslt. Этот метод прекрасен в плане экономии ресурсов, но нужно понимать его суть и понимать где и как он сработает

то есть, в вашем случае он не поможет, так как вам надо отфильтровать среди всех элементов, выводимых в меню те, у которых есть галочка в поле с именем secondary

Небольшое пояснение:

Например, хочу вывести меню, я запрашиваю его макросом
<xsl:apply-templates select="document('udata://content/menu/0/2')/udata" mode="vertical_menu"/>

для начала посмотрим, что нам возвращает система при таком запросе, введем в адресной строке http://мойсайт/udata://content/menu/0/2/
-----------------------------------------------------------------------------------------
не забывайте, что у вас может быть отключен протокол usel, про то, почему вы не видите результатов в браузере, читайте в документации http://help-dev.umi-cms.ru/chapter.XSLTTemplates.usel.html в самом начале раздел "Замечание".
а также вы увидите xml структуру далеко не в каждом браузере, я работаю в mozilla и в нем показывается xml документ корректно, а вот в internet explorer  например, показывает только текст, без тегов

-----------------------------------------------------------------------------------------
<udata module="content" method="menu" generation-time="0.036790">
<items>
<item id="7" link="/" name="Главная" xlink:href="upage://7">Главная</item>
<item id="9" link="/news/" name="Новости" xlink:href="upage://9">Новости</item>
<item id="11" link="/price-list/" name="Прайс" xlink:href="upage://11">Прайс</item>
<item id="90" link="/vacancy/" name="Вакансии" xlink:href="upage://90">Вакансии</item>
<item id="95" link="/partners/" name="Монтажные работы" xlink:href="upage://95">Монтажные работы</item>
<item id="290" link="/contacts/" name="Контакты" xlink:href="upage://290">Контакты</item>
</items>
</udata>
<!-- This page generated in 0.083 secs -->

как мы видим в результате нет информации о том поставлена галочка  secondary или нет, это мы можем узнать только запросив информацию о каждом конкретном объекте. Например, так http://мойсайт/upage://9/ мы получим доступ к параметрам новостей (страницы с id = 9) .

Но это не экономно (ведь проще сделать выборку средствами php, наш пресловутый usel, а не перебирать все элементы меню, подгружая все их параметры).

А вот если бы у нас стояла задача вывести из этого списка элемент с id=9, то это, пожалуйста.

тогда мы бы могли сделать такой шаблон

 <xsl:template match="udata[@module = 'content' and @method = 'menu']" mode="vertical_menu">
<ul>
 <xsl:apply-templates select="items/item" mode="vertical_menu"/>
</ul>
 </xsl:template>
<!-- шаблон для пункта Верт.меню -->
 <xsl:template match="item[@id=9]" mode="vertical_menu">
<li>
 <a href="{@link}">
<xsl:value-of select="@name"/>
 </a>
</li>
 </xsl:template>

Но тут есть маленькое но, в шаблоне <xsl:template match="udata[@module = 'content' and @method = 'menu']" mode="vertical_menu"> мы вызывали <xsl:apply-templates select="items/item" mode="vertical_menu"/>

то есть мы сделали выборку всех item из результата, Вопрос в том, что шаблон для вывода результата мы задали только для элемента с id=9, а что будет с остальными? Они тоже будут обрабатываться, но ненайдя шаблон для себя не как себя не отобразят. Но чтобы еще сэкономить ресурсов, лучше задать ограничение на вывод элементов в первом шаблоне, то есть так:


 <xsl:template match="udata[@module = 'content' and @method = 'menu']" mode="vertical_menu">
<ul>
 <xsl:apply-templates select="items/item[@id=9]" mode="vertical_menu"/>
</ul>
 </xsl:template>
<!-- шаблон для пункта Верт.меню -->
 <xsl:template match="item" mode="vertical_menu">
<li>
 <a href="{@link}">
<xsl:value-of select="@name"/>
 </a>
</li>
 </xsl:template>

Ну, что-то я уже стал углубляться)
Подведем итог:
В вашем случае (вывод элементов меню с галочкой secondary), не удастся воспользоваться этим фокусом (<xsl:template match="result[//property[@name='my_property]]">) не нагрузив систему сильнее, чем при usel запросе, но в других случаях это может значительно облегчить вашу жизнь)
« Последнее редактирование: 23 Июня 2011, 12:47:55 от admin »

*

polo

  • *
  • 19
  • +0/-0
    • Просмотр профиля
Спасибо, интересно. Особенно про <xsl:apply-templates select="items/item[@id=9]". Запомню.