UMIhelp

Разработка сайта на UMI.CMS => Шаблоны XSLT => Тема начата: Aksuk от 02 Марта 2012, 03:03:25

Название: Прошу помощи с usel - необходимо отфильтровать новости по кастомному полю
Отправлено: Aksuk от 02 Марта 2012, 03:03:25
Добрый день!
Сейчас доделываю проект, который начинал не сам и прямо в рабочих условиях знакомлюсь с 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/

Заранее спасибо!
Название: Re:Прошу помощи с usel - необходимо отфильтровать новости по кастомному полю
Отправлено: admin от 02 Марта 2012, 04:49:47
сам шаблон у тебя уже есть

Цитировать

Код:

<?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,'&amp;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>


Вот и все. Код писал по памяти, так что проверяй синтаксис.
Название: Re:Прошу помощи с usel - необходимо отфильтровать новости по кастомному полю
Отправлено: Aksuk от 03 Марта 2012, 02:10:19
Спасибо! Все заработало. Вообще xslt - интересная вещь, но пока весь этот синтаксис и логика не осядут "на пальцах" - намыкаешься ))
Название: Re:Прошу помощи с usel - необходимо отфильтровать новости по кастомному полю
Отправлено: Aksuk от 03 Марта 2012, 04:28:11
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, но оно левое, страницы тасовались недавно...
Название: Re:Прошу помощи с usel - необходимо отфильтровать новости по кастомному полю
Отправлено: admin от 03 Марта 2012, 09:48:43
a строчка

<xsl:variable name="publish_time" select="document(concat(@xlink:href,'.publish_time'))//value" />

возвращает значение? просто иногда @xlink:href атрибуты не читаются если путаница с пространством имен есть
Название: Re:Прошу помощи с usel - необходимо отфильтровать новости по кастомному полю
Отправлено: Aksuk от 03 Марта 2012, 12:44:15
Если я напишу просто в шаблоне для page:
<xsl:value-of select="document(concat(@xlink:href,'.publish_time'))//value" />
- все отлично подключится, но в сыром формате.

Или для переменных есть дополнительные условия?
Название: Re:Прошу помощи с usel - необходимо отфильтровать новости по кастомному полю
Отправлено: admin от 03 Марта 2012, 18:26:54
ладно, явно проблема в какой-то мелочи типа опечатки или т.п.

пользуй такой код (это код взят из шаблона для вывода новости, немного переделан)

<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>
Название: Re:Прошу помощи с usel - необходимо отфильтровать новости по кастомному полю
Отправлено: Aksuk от 04 Марта 2012, 01:45:14
Да, все заработало с маленькими поправками, спасибо!

Вот пример - 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>

Опять что-то основное упускаю...
Название: Re:Прошу помощи с usel - необходимо отфильтровать новости по кастомному полю
Отправлено: admin от 04 Марта 2012, 03:00:49
у тебя p возвращает только значение параметра, а кто будет прописывать за тебя &p=
Название: Re:Прошу помощи с usel - необходимо отфильтровать новости по кастомному полю
Отправлено: Aksuk от 04 Марта 2012, 17:44:06
у тебя p возвращает только значение параметра, а кто будет прописывать за тебя &p=

Действительно... Тем более, что похожая задача уже была у меня с другим сайтом на tpl. Значит надо custom.php редактировать? Для xslt - так же как в статье про dataDoSelection? Кстати, на сайте почему-то она не открывается, только архив с материалами доступен.
Название: Re:Прошу помощи с usel - необходимо отфильтровать новости по кастомному полю
Отправлено: admin от 05 Марта 2012, 10:07:46
не надо код редактировать, надо править твой шаблон....

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,'&amp;p',$p, '/'))/udata" mode="filter_page" />

в строчке с перечислением параметров при обращении к протоколам(в том числе к usel), & заменяй на его код &amp;
Название: Re:Прошу помощи с usel - необходимо отфильтровать новости по кастомному полю
Отправлено: Aksuk от 05 Марта 2012, 23:01:29
Все, понял )) получается, я просто неверно представлял себе синтаксис concat, прошу прощения.

Все работает. Спасибо!