Привет, мир.
Я тут замыслил такую задачу.
Есть некий набор услуг, часть из которых являются второстепенными. Необходимо создать 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 и прочей логики...
Спасибо всем, кто задумается.
Спасибо за ответ.
Решил пока не париться с Usel (рано мне еще )) и сделал через if.
Правда, вот в доках видел пример, что можно указать проверку на наличие свойства в объекте вот так:
<xsl:template match="result[//property[@name='my_property]]">
<p>Страница со свойством my_property </p>
</xsl:template>
Но адаптировать к моему случаю с меню так и не осилил.
насчет 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 запросе, но в других случаях это может значительно облегчить вашу жизнь)