Добрый день!
Сейчас доделываю проект, который начинал не сам и прямо в рабочих условиях знакомлюсь с xslt.
Подскажите - как можно динамически передать параметр в шаблон usel?
Задача - создать список отфильтрованных по кастомному параметру страниц (новостей).
Сайт - http://www.raspp.ru/ Раздел "по странам Азии". Сначала задание было - сделать список из 3-4 последних материалов, отмеченных тегом страны (параметр strana) - как сейчас. Теперь необходимо выводить по клику на заголовке страницу в формате ленты новостей со всеми тематическими статьями. В первом случае я использовал getFilteredPages, теперь хочу сделать все через usel. Задача простая, пока я могу где-то задать в явном виде id параметра "strana" (см - http://www.raspp.ru/materialy_po_stranam/materialy_po_kitayu/ - там этот параметр задан на уровне шаблона и равен 28553), но хочется, чтобы он динамически подставлялся в шаблон страницы вывода (она сама имеет то же самое значение этого поля).
Каким должен быть запрос в шаблоне страницы? Или может быть есть возможность вообще не плодить лишних статических документов, а создавать итоговую по запросу с главной страницы?
На всякий случай - шаблон usel:
<?xml version="1.0" encoding="utf-8"?>
<selection>
<target expected-result="pages">
<type module="news" method="item" />
</target>
<property name="strana">
<object>{1}</object>
</property>
<limit page="0">{limit}</limit>
</selection>
Запрос (на примере Китая)
usel://News_filter/28553/?limit=10/
Заранее спасибо!
сам шаблон у тебя уже есть
Код:
<?xml version="1.0" encoding="utf-8"?>
<selection>
<target expected-result="pages">
<type module="news" method="item" />
</target>
<property name="strana">
<object>{1}</object>
</property>
<limit page="0">{limit}</limit>
</selection>
Запрос (на примере Китая)
Цитировать
usel://News_filter/28553/?limit=10/
все что тебе остается это сделать шаблон для всех страниц на которых выводятся отфильтрованные новости.
Давай по порядку.
1. создаешь ссылку на страницу с отфильтрованными новостями. В твоем случае это заголовок (видимо со страной). На пример страна Китай которая имеет id=333 в справочнике strana.
<a href="/usel_result_page/?stranaId=333">Китай</a>
2. создаешь страницу в админке с именем "usel_result_page" (имя выбрано наугад для примера).
3. назначаешь этой странице шаблон, в котором идет вызов usel протокола, которому надо передать параметр stranaId из адресной строки.
3.1 для того чтобы подхватить параметр из адресной строки найди в файле /xsltTpls/default.xsl строчку вида <xsl:param name="p">0</xsl:param>, эта строчка подхватывает параметр p из адресной строки или если такого параметра нет, подставляет дефолтное значение 0. Эта переменная доступна на любом уровне вложенности, в любом шаблоне, который определен ниже. Делаешь по образу и подобию? с дефолтным значением no. Позже станет ясно зачем нам дефолтное значение
<xsl:param name="stranaId">no</xsl:param>
3.2 пишем xslt кусок для динамической usel выборки (вставишь куда необходимо выводить результаты)
<xsl:if test="not($stranaId='no')">
<xsl:apply-templates select="document(concat('usel://News_filter/?stranaId=',$stranaId,'&limit=10'))/udata" />
</xsl:if>
мы делаем проверку подхватилась ли переменная $stranaId из адресной строки и если да? делаем вызов usel протокола. Только при такой записи, твой usel файл немного поменяется.
<?xml version="1.0" encoding="utf-8"?>
<selection>
<target expected-result="pages">
<type module="news" method="item" />
</target>
<property name="strana">
<object>{stranaId}</object>
</property>
<limit page="0">{limit}</limit>
</selection>
Вот и все. Код писал по памяти, так что проверяй синтаксис.
Upd: Вот, например - не могу понять простую вещь - как конвертировать дату в заголовках? Достаю ее через upage, а каким образом ее передать systemConvertDate?
Запрос из основного шаблона новостей (здесь все понятно):
<span xmlns:umi="umi" umi:element-id="{@id}" umi:field-name="publish_time">
<xsl:apply-templates select="document(concat('udata://system/convertDate/',@publish_time,'/d.m.Y/'))/udata" />
</span>
В usel-выборке страниц поля "publish_time", нет, делаю переменную:
<xsl:variable name="publish_time" select="document(concat(@xlink:href,'.publish_time'))//value" />
Но просто подставить ее в шаблон не получается. Результат нулевой. При том, что сам по себе этот вызов отлично работает.
Пока что "для вида" поставил значение @publish-time, но оно левое, страницы тасовались недавно...
a строчка
<xsl:variable name="publish_time" select="document(concat(@xlink:href,'.publish_time'))//value" />
возвращает значение? просто иногда @xlink:href атрибуты не читаются если путаница с пространством имен есть
Если я напишу просто в шаблоне для page:
<xsl:value-of select="document(concat(@xlink:href,'.publish_time'))//value" />
- все отлично подключится, но в сыром формате.
Или для переменных есть дополнительные условия?
ладно, явно проблема в какой-то мелочи типа опечатки или т.п.
пользуй такой код (это код взят из шаблона для вывода новости, немного переделан)
<xsl:template match="item" mode="news-list">
<xsl:param name="item-info" select="document(concat('upage://', @id))" />
<xsl:param name="publish_time" select="$item-info//property[@name = 'publish_time']/value/@unix-timestamp" />
...
<i umi:element-id="{@id}" umi:field-name="publish_time">
<xsl:value-of select="document(concat('udata://system/convertDate/',$publish_time,'/(d.m.Y)'))/udata" />
</i>
...
</xsl:template>
Да, все заработало с маленькими поправками, спасибо!
Вот пример - http://www.raspp.ru/materialy_po_stranam/?strana=28553/ (http://www.raspp.ru/materialy_po_stranam/?strana=28553/)
Следующая остановка - пейджинг. В этой (http://"http://wiki.umisoft.ru/%D0%9F%D1%8D%D0%B9%D0%B4%D0%B6%D0%B8%D0%BD%D0%B3_%D0%BE%D0%B1%D1%8A%D0%B5%D0%BA%D1%82%D0%BE%D0%B2,_%D0%BA%D0%BE%D1%82%D0%BE%D1%80%D1%8B%D0%B5_%D1%84%D0%B8%D0%BB%D1%8C%D1%82%D1%80%D1%83%D1%8E%D1%82%D1%81%D1%8F_%D1%81_%D0%BF%D0%BE%D0%BC%D0%BE%D1%89%D1%8C%D1%8E_usel_%D0%BD%D0%B0_XSLT") статье описан вроде бы подходящий метод, но похоже я запутался с синтаксисом вызова. Переменная $total работает (внизу появляются номера страниц), но параметр p, хотя передается в ссылку, почему-то не работает.
По идее ссылка выглядит вот так: http://www.raspp.ru/novosti/eurasia-news/?p=1
У меня же: http://www.raspp.ru/materialy_po_stranam/?p=1&strana=28553%2F
Запрос: <xsl:apply-templates select="document(concat('usel://News_filter/?strana=', $strana, $p, '/'))/udata" mode="filter_page" />
Шаблон usel:
<target expected-result="pages">
<type module="news" method="item" />
</target>
<property name="strana">
<object>{strana}</object>
</property>
<sort order="descending">publish_time</sort>
<limit page="{1}">10</limit>
Опять что-то основное упускаю...
не надо код редактировать, надо править твой шаблон....
1. у тебя есть страница
http://www.raspp.ru/materialy_po_stranam/?p=1&strana=28553%2F
2. из адресной строки должны подхватываться и код страны "strana" и параметр пагинации "p"
чтобы подхватить параметр из адресной строки найди в файле /xsltTpls/default.xsl строчку вида <xsl:param name="p">0</xsl:param>, эта строчка подхватывает параметр p из адресной строки или если такого параметра нет, подставляет дефолтное значение 0. Эта переменная доступна на любом уровне вложенности, в любом шаблоне, который определен ниже. Делаешь по образу и подобию, с дефолтным значением no. Позже станет ясно зачем нам дефолтное значение
Код:
<xsl:param name="strana">no</xsl:param>
3. а потом в нужном месте делаем вызов usel вот таким образом
<xsl:apply-templates select="document(concat('usel://News_filter/?strana=', $strana,'&p',$p, '/'))/udata" mode="filter_page" />
в строчке с перечислением параметров при обращении к протоколам(в том числе к usel), & заменяй на его код &