Курс 2016 года “Разработка на UMI.CMS от 0 до готового сайта”
отображение запроса USEL в виде запроса SQL

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

Ответов: 5
Просмотров: 4205
Последний ответ 11 Января 2013, 19:48:58
от admin
Вывод объектов каталога через USEL по элементу в справочнике

Автор AxiomateriaРаздел Шаблоны XSLT

Ответов: 6
Просмотров: 4601
Последний ответ 20 Июля 2013, 20:31:56
от NOIRMAN
Выборка USEL с несколькими параметрами для одного поля

Автор sempl84Раздел Шаблоны XSLT

Ответов: 3
Просмотров: 3164
Последний ответ 29 Ноября 2012, 11:05:03
от niakriss
Вывод порядковый номер (нумерация) при usel выдачи

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

Ответов: 5
Просмотров: 3369
Последний ответ 25 Сентября 2013, 13:37:27
от admin
Пагинация при выводе данных через usel

Автор AxiomateriaРаздел Шаблоны XSLT

Ответов: 9
Просмотров: 5580
Последний ответ 18 Декабря 2013, 23:48:27
от Axiomateria

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

*

Aksuk

  • *
  • 44
  • +0/-0
    • Просмотр профиля
Добрый день!
Сейчас доделываю проект, который начинал не сам и прямо в рабочих условиях знакомлюсь с 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/

Заранее спасибо!
« Последнее редактирование: 02 Марта 2012, 03:05:48 от Aksuk »

*

admin

  • *****
  • 2444
  • +172/-1
    • Просмотр профиля
сам шаблон у тебя уже есть

Цитировать

Код:

<?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>


Вот и все. Код писал по памяти, так что проверяй синтаксис.

*

Aksuk

  • *
  • 44
  • +0/-0
    • Просмотр профиля
Спасибо! Все заработало. Вообще xslt - интересная вещь, но пока весь этот синтаксис и логика не осядут "на пальцах" - намыкаешься ))

*

Aksuk

  • *
  • 44
  • +0/-0
    • Просмотр профиля
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, но оно левое, страницы тасовались недавно...
« Последнее редактирование: 03 Марта 2012, 04:32:52 от Aksuk »

*

admin

  • *****
  • 2444
  • +172/-1
    • Просмотр профиля
a строчка

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

возвращает значение? просто иногда @xlink:href атрибуты не читаются если путаница с пространством имен есть

*

Aksuk

  • *
  • 44
  • +0/-0
    • Просмотр профиля
Если я напишу просто в шаблоне для page:
<xsl:value-of select="document(concat(@xlink:href,'.publish_time'))//value" />
- все отлично подключится, но в сыром формате.

Или для переменных есть дополнительные условия?

*

admin

  • *****
  • 2444
  • +172/-1
    • Просмотр профиля
ладно, явно проблема в какой-то мелочи типа опечатки или т.п.

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

<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>

*

Aksuk

  • *
  • 44
  • +0/-0
    • Просмотр профиля
Да, все заработало с маленькими поправками, спасибо!

Вот пример - http://www.raspp.ru/materialy_po_stranam/?strana=28553/

Следующая остановка - пейджинг. В этой статье описан вроде бы подходящий метод, но похоже я запутался с синтаксисом вызова. Переменная $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>

Опять что-то основное упускаю...

*

admin

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

*

Aksuk

  • *
  • 44
  • +0/-0
    • Просмотр профиля
у тебя p возвращает только значение параметра, а кто будет прописывать за тебя &p=

Действительно... Тем более, что похожая задача уже была у меня с другим сайтом на tpl. Значит надо custom.php редактировать? Для xslt - так же как в статье про dataDoSelection? Кстати, на сайте почему-то она не открывается, только архив с материалами доступен.
« Последнее редактирование: 04 Марта 2012, 23:28:25 от Aksuk »

*

admin

  • *****
  • 2444
  • +172/-1
    • Просмотр профиля
не надо код редактировать, надо править твой шаблон....

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;

*

Aksuk

  • *
  • 44
  • +0/-0
    • Просмотр профиля
Все, понял )) получается, я просто неверно представлял себе синтаксис concat, прошу прощения.

Все работает. Спасибо!
« Последнее редактирование: 05 Марта 2012, 23:14:48 от Aksuk »