я бы воспользовался макросом %data doSelection()% (описание: http://help-dev.umi-cms.ru/data.doSelection.html и описание протокола usel http://help-dev.umi-cms.ru/chapter.XSLTTemplates.usel.html).
Несколько примеров описано тут http://wiki.umisoft.ru/%D0%9F%D1%80%D0%B8%D0%BC%D0%B5%D1%80%D1%8B_%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F_%D0%BC%D0%B0%D0%BA%D1%80%D0%BE%D1%81%D0%B0_data_doSelection
В вашем случае xml файл выборки будет выглядеть примерно так:
<?xml version="1.0" encoding="UTF-8"?>
<selection>
<target result="pages">
<type id="651" />
</target>
<sort order="descending">publish_time</sort>
<limit page="0">10</limit>
</selection>
Где в type id вам надо вписать id типа данных комментарии (его можно посмотреть в адресной строке если в модуле шаблоны данных открыть комментарии н редактировании), так как у меня в разных версиях umi это разный id
Решение следующее.
В файле /classes/modules/custom.php сразу после строки
//TODO: Write your own macroses here
напишите:
public function random_child_id($element_id) {
$childs = Array();
$childs = umiHierarchy::getInstance()->getChilds($element_id);
$rand_element = array_rand($childs, 1);
return $rand_element;
}
С помощью %custom random_child_id([element_id = '0'])%
Мы получаем id страницы
element_id - id родителя - обязательный параметр
Далее в нужном месте вставьте макрос
%news lastlist('27871', 'otzyv_index', 1, 1)%<
где 27871 - id нашей ленты а в шаблоне otzyv_index.tpl
%data getproperty('%custom random_child_id(27871)%', 'otzyv', 'string')%
Макрос %custom random_child_id(27871)% каждуй раз выдает нам разный id и мы получаем кажду раз новый анонс новости.
тебе нужен вот такой xml (пусть данный файл называется /usels/news_rand.xsl)
<?xml version="1.0" encoding="utf-8"?>
<selection>
<target result="pages">
<type module="news" method="item" />
<category depth="1">{1}</category>
</target>
<sort>rand()</sort>
<limit page="0">1</limit>
</selection>
вызывать его следует так %data doSelection(news_rand_template, news_rand, 27871 )%
где 27871 - id ленты новостей из которой мы хотим вытянуть рандомную новость
У меня вопрос про XSLT, но раз уж usel универсален для обоих шаблонизаторов, то вот какое дело:
я бы воспользовался макросом %data doSelection()% (описание: http://help-dev.umi-cms.ru/data.doSelection.html и описание протокола usel http://help-dev.umi-cms.ru/chapter.XSLTTemplates.usel.html).
Несколько примеров описано тут http://wiki.umisoft.ru/%D0%9F%D1%80%D0%B8%D0%BC%D0%B5%D1%80%D1%8B_%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F_%D0%BC%D0%B0%D0%BA%D1%80%D0%BE%D1%81%D0%B0_data_doSelection
В вашем случае xml файл выборки будет выглядеть примерно так:
<?xml version="1.0" encoding="UTF-8"?>
<selection>
<target result="pages">
<type id="651" />
</target>
<sort order="descending">publish_time</sort>
<limit page="0">10</limit>
</selection>
Где в type id вам надо вписать id типа данных комментарии (его можно посмотреть в адресной строке если в модуле шаблоны данных открыть комментарии н редактировании), так как у меня в разных версиях umi это разный id
У меня получилось в XSLT вывести на главную страницу только названия самих страничек с комментариями (которых три штуки) таким вот способом: <xsl:apply-templates select="document('usel://MainBookReviews/')" mode="main-book-reviews" /> и файлом MainBookReviews.xsl (папка ../usels/) с содержимым
<?xml version="1.0" encoding="UTF-8"?>
<selection>
<target result="pages">
<type id="63" />
</target>
<sort order="descending">publish_time</sort>
<limit page="0">3</limit>
</selection>
Но конечная цель вывести комментарии (последние три) на главную страницу в полном виде, в котором отображается дата, автор, заголовок комментария и сам текст комментария...
Попытался подключить через mode="main-book-reviews" в вызове
<xsl:apply-templates select="document('usel://MainBookReviews/')" mode="main-book-reviews" />
шаблон отображения комментариев в стандартном файле из "demodizzy" comment-view.xsl в папке ../modules/comments/, но не получается...
Что я не доделал ?
конструкция copy-of выводит xml
используйте такой вариант
<textarea style="height:500px; width:900px">
<xsl:copy-of select="usel://MainBookReviews/" />
</textarea>
или в адресной строке вбейте http://temp03.web-image.ru/usel://MainBookReviews/ и вы увидите xml того что вам возвратиться и сравните его с тем что ожидает чыд шаблоны при обработке комментариев http://dev.docs.umi-cms.ru/spravochnik_makrosov_umicms/kommentarii/comments_insert/#xslt-templating
... или в адресной строке вбейте http://temp03.web-image.ru/usel://MainBookReviews/ и вы увидите xml того что вам возвратиться и сравните его с тем что ожидает чыд шаблоны при обработке комментариев http://dev.docs.umi-cms.ru/spravochnik_makrosov_umicms/kommentarii/comments_insert/#xslt-templating
и выдала система вот такое:
<udata generation-time="0.0">
<error>You don't have permissions to call protocol "usel://" via HTTP</error>
</udata>
нодо прописать или исправить в файле ./config.ini настройку usel.http.allow = 1 см. подробнее в документации http://dev.docs.umi-cms.ru/nastrojka_sistemy/dostupnye_sekcii/sekciya_streams/
Уже подключил и вот что получается в виде xml
<udata module="usel" method="MainBookReviews" generation-time="0.025882">
<page id="108" parentId="107" link="/information_for_tourists/feedback_and_suggestions/spasibo_za_novye_vpechatleniya/" is-active="1" object-id="677" type-id="63" type-guid="comments-comment" update-time="1373045167" alt-name="spasibo_za_novye_vpechatleniya" xlink:href="upage://108">
<basetype id="38" module="comments" method="comment">Комментарий</basetype>
<name>Спасибо за новые впечатления!</name>
</page>
<page id="154" parentId="107" link="/information_for_tourists/feedback_and_suggestions/vtoroj_testovyj_otzyv/" is-active="1" object-id="756" type-id="63" type-guid="comments-comment" update-time="1373879075" alt-name="vtoroj_testovyj_otzyv" xlink:href="upage://154">
<basetype id="38" module="comments" method="comment">Комментарий</basetype>
<name>Второй тестовый отзыв!</name>
</page>
<page id="155" parentId="107" link="/information_for_tourists/feedback_and_suggestions/otzyv_nomer_3_-_test/" is-active="1" object-id="757" type-id="63" type-guid="comments-comment" update-time="1373879120" alt-name="otzyv_nomer_3_-_test" xlink:href="upage://155">
<basetype id="38" module="comments" method="comment">Комментарий</basetype>
<name>Отзыв номер 3 - тест</name>
</page>
<total>6</total>
</udata>
В общем что вызываем, то и получаем.
Осталось додуматься как вывести текст комментария, и имя его автора...
То есть надо подумать над самим файлом MainBookReviews,xsl с конструкцией видимо:
<?xml version="1.0" encoding="UTF-8"?>
<selection>
<target result="pages">
<type id="63" />
</target>
<sort order="descending">publish_time</sort>
<limit page="0">3</limit>
</selection>
?
В документации http://dev.docs.umi-cms.ru/spravochnik_makrosov_umicms/kommentarii/comments_insert/#xslt-templating приведён пример с вызовом как я уже опробовал: <xsl:apply-templates select="document('udata://comments/insert/3')" mode="review" />
и тогда появляются <item> в которых и содержится текст комментария:
<item
id="20" title="Заголовок первого комментария" author_id="27142" num="1"
xlink:href="upage://20"
xlink:author-href="udata://users/viewAuthor/27142"
publish_time="1255517104">Текст первого комментария</item>
А вот как через usel это же самое вытащить?
можно через тег extended (http://dev.docs.umi-cms.ru/shablony_i_makrosy/xslt-shablonizator_umi_cms/vyborki_iz_bd_protokol_usel/#extended), который вы указываете в usel xml файле
Спасибо, немного полегче стало. Только вот все данные идут сплошной кашей...
http://temp03.web-image.ru/
Сам файл MainBookReviews.xml отредактировал и он теперь такой:
<?xml version="1.0" encoding="UTF-8"?>
<selection>
<target result="pages">
<type id="161" />
</target>
<extended>
<properties>h1, message, author_id, publish_time</properties>
</extended>
<limit page="0">1</limit>
</selection>
И не понятно ни как - почему же всё таки в вызове (который в шаблоне главной страницы) <xsl:apply-templates select="document('usel://MainBookReviews/')" mode="main-book-reviews"/>
не подключается сам шаблон mode="main-book-reviews" ?
дело в том, что шаблон для вывода комментария ищет item узел, а usel возвращает туже информацию в page узле. Еще раз сравните xml usel ответа и ответа макроса comment insert()? они совершенно разные и это надо учитывать. Ваши шаблоны для вывода комментариев требует либо клонирования с переделкой, либо добавления доп инструкций... наглядней создать копию шаблонов для вывода комментариев и указать в них match и все прочие выводы данных, отталкиваясь от того где они лежат в xml usel ответа.
На данный момент три комментария в xml выглядят так: http://temp03.web-image.ru/usel://MainBookReviews/
- то есть они в принципе существуют и должны выводиться по идее вызовом
<xsl:apply-templates select="document('usel://MainBookReviews/')/udata" mode="main-book-reviews"/> на главной странице.
.
Что почти мне мне удалось, то есть вывести на главную через шаблон mode="main-book-reviews"
<xsl:template match="udata" mode="main-book-reviews">
<b><xsl:value-of select="//group[@name='common']/property[@name='h1']/value" /></b>
<p><xsl:text>«</xsl:text><xsl:value-of select="//group[@name='comment_props']/property[@name='message']/value" disable-output-escaping="yes" /><xsl:text>»</xsl:text></p>
<p>
<xsl:value-of select="//group[@name='comment_props']/property[@name='author_id']/value/item/@name" />
<i><xsl:value-of select="//group[@name='comment_props']/property[@name='publish_time']/value" /></i>
</p>
</xsl:template>
<xsl:template match="page|item" mode="main-book-reviews">
<xsl:apply-templates select="page">
<xsl:value-of select="." />
</xsl:apply-templates>
</xsl:template>
НО пока только один комментарий удаётся вывести, когда как их там изначально три....
видимо что-то опять не доделал или в упор решение не вижу...
1. В общем теле шаблона (match=udata) вы пытаетесь вывести данные для страницы. Этот вывод хорошо бы перенести в шаблон для page
2. В нем же (match=udata) было бы неплохо вызвать шаблон page
Я последовал вашему совету, NOIRMAN. и если всё правильно понял я так и сделал:
<xsl:template match="udata" mode="main-book-reviews">
<b><xsl:value-of select="//group[@name='common']/property[@name='h1']/value" /></b>
<p><xsl:text>«</xsl:text><xsl:value-of select="//group[@name='comment_props']/property[@name='message']/value" disable-output-escaping="yes" /><xsl:text>»</xsl:text></p>
<p>
<xsl:value-of select="//group[@name='comment_props']/property[@name='author_id']/value/item/@name" />
<i><xsl:value-of select="//group[@name='comment_props']/property[@name='publish_time']/value" /></i>
</p>
</xsl:template>
<xsl:template match="page|item" mode="main-book-reviews">
<xsl:apply-templates select="page">
<xsl:value-of select="." />
</xsl:apply-templates>
</xsl:template>
Однако снова теперь в результате вижу сплошную кашу из данных о комментариях (правый нижний блок): http://temp03.web-image.ru/
Попробуйте примерно в таком виде:
<xsl:template match="udata" mode="main-book-reviews">
<xsl:apply-templates select="page" mode="main-book-reviews" />
</xsl:template>
<xsl:template match="page|item" mode="main-book-reviews">
<b><xsl:value-of select="//group[@name='common']/property[@name='h1']/value" /></b>
<p><xsl:text>«</xsl:text><xsl:value-of select="//group[@name='comment_props']/property[@name='message']/value" disable-output-escaping="yes" /><xsl:text>»</xsl:text></p>
<p>
<xsl:value-of select="//group[@name='comment_props']/property[@name='author_id']/value/item/@name" />
<i><xsl:value-of select="//group[@name='comment_props']/property[@name='publish_time']/value" /></i>
</p>
</xsl:template>
Попробуйте примерно в таком виде:
<xsl:template match="udata" mode="main-book-reviews">
<xsl:apply-templates select="page" mode="main-book-reviews" />
</xsl:template>
<xsl:template match="page|item" mode="main-book-reviews">
<b><xsl:value-of select="//group[@name='common']/property[@name='h1']/value" /></b>
<p><xsl:text>«</xsl:text><xsl:value-of select="//group[@name='comment_props']/property[@name='message']/value" disable-output-escaping="yes" /><xsl:text>»</xsl:text></p>
<p>
<xsl:value-of select="//group[@name='comment_props']/property[@name='author_id']/value/item/@name" />
<i><xsl:value-of select="//group[@name='comment_props']/property[@name='publish_time']/value" /></i>
</p>
</xsl:template>
Спасибо, попробовал. Но у меня уже ранее похожее такое получалось - то есть выводится один и тот же первый комментарий три раза подряд... А там три разных комментария...
И здесь их три разных http://temp03.web-image.ru/usel://MainBookReviews/
Может быть теперь с вызовом <xsl:apply-templates select="document('usel://MainBookReviews/')/udata" mode="main-book-reviews"/>
надо как-то ещё поработать ?
Вот например такой вариант вызова <xsl:apply-templates select="document(concat('upage://', document(concat('usel://MainBookReviews/', @id))/udata/page/@id))/udata/page" mode="main-book-reviews" />
выводит только один комментарий (при чём первый, когда как надо конечно последний)...
Проверьте, нет ли после этих шаблонов их клонов (match="page" mode="main-book-reviews") с другим кодом.
- проверил, точно клонов нет.
Кстати, а откуда взялись в коде этих шаблонов узлы "//group[]". В выдаче usel-а их нет ...
- вот здесь-то собака и порылась!
после того как я отредактировал шаблон обработки для каждого комментария убрав "//group[]"
<xsl:template match="page|item" mode="main-book-reviews">
<b><xsl:value-of select=".//property[@name='h1']/value" /></b>
<p><xsl:text>«</xsl:text><xsl:value-of select=".//property[@name='message']/value" disable-output-escaping="yes" /><xsl:text>»</xsl:text></p>
<p>
<xsl:value-of select=".//property[@name='author_id']/value/item/@name" />
<i><xsl:value-of select=".//property[@name='publish_time']/value" /></i>
</p>
</xsl:template>
- всё комментарии стали выводиться как надо.
Вот только одна последняя деталь осталась, а точнее две:
Имя автора выводится через <xsl:value-of select=".//property[@name='author_id']/value/item/@name" />
в виде "Дмитрий Ефремов (axiomateria@bk.ru)",
а дата выводится через <xsl:value-of select=".//property[@name='publish_time']/value" />
в виде "Sat, 29 Jun 2013 00:11:00 +0400",
когда как необходимо что бы имя автора было просто "Дмитрий Ефремов ", а дата "29.06.2013"
Это в шаблоне надо редактировать форматы как-то или в usel указывать параметры дополнительные?
На данный момент файл usel, который вызывается в главной стрaнице так <xsl:apply-templates select="document('usel://MainBookReviews/')/udata" mode="main-book-reviews"/>
вот такой изнутри:
<?xml version="1.0" encoding="UTF-8"?>
<selection>
<target result="pages">
<type id="161" />
</target>
<sort order="descending">publish_time</sort>
<extended>
<properties>h1, message, author_id, publish_time</properties>
</extended>
<limit page="0">3</limit>
</selection>