UMIhelp

Разработка сайта на UMI.CMS => Шаблоны XSLT => Тема начата: Sumrakrnd от 08 Декабря 2016, 13:02:37

Название: Вызов рубрики и alt-name в новость, разделение на прошедшие и действующие
Отправлено: Sumrakrnd от 08 Декабря 2016, 13:02:37
Доброго времени суток.

Создала страницу новостей
Вывела новости, рубрики в которых они находятся, их alt-name, т.к. он нужен для фильтра, вроде все хорошо.
Но вот в каждой новости должно быть название категории к которой он относится и так же нужен alt-name для блока в котором новость...
- Новости и события (основная лента)
-- Общие вопросы(лента)
---Новость 1
-- Конференции и семинары(лента)
-- Тренинг-центр(лента)

Но тем же методом, который я использовала для lastlents, у меня внутри новости не получается вывести название ленты, в которой она находится, а получилось вывести название и alt-name, корневой ленты новостей...


	<xsl:template match="result[@module = 'news'][@method = 'rubric']">

<xsl:apply-templates select="document('udata://news/lastlents/(alls-news)/notemplate/10/0')"/>

<!--Кстати, а можно избежать указания id номеров, если я прописываю @id, то новости не отображаются -->
<xsl:apply-templates select="document(concat('udata://news/lastlist/', '(1090)(1091)(1092)(1093)(1094)(1095)(1096)', '//10/0/?extProps=publish_time,h1,content,news_image,anons'))/udata" />

    </xsl:template>

<xsl:template match="udata[@method = 'lastlents']">
<div class="rubrics">
<h4>Рубрики</h4>
<ul id="rubric-nav" umi:element-id="{$document-page-id}" umi:region="list" umi:module="news" umi:method="lastlist" umi:sortable="sortable">
<li class="alls-news">
<a rel="alls-news" class="">
<xsl:if test="position() = 1">
<xsl:attribute name="class">current</xsl:attribute>
</xsl:if>
Все
</a>
</li>
<xsl:apply-templates select="items/item" mode="news-rubrics" />
</ul>
</div>
</xsl:template>


<xsl:template match="item" mode="news-rubrics">
<li class="{document(concat('upage://',@id))/udata/page/@alt-name}" umi:element-id="{@id}" umi:region="row">
<a rel="{document(concat('upage://',@id))/udata/page/@alt-name}">
<xsl:value-of select="node()" />
</a>
</li>
</xsl:template>


<xsl:template match="udata[@method = 'lastlist']">
<div class="tabs">
<div class="numpages">
<xsl:apply-templates select="total" />
</div>

<ul class="tabs__caption">
<li class="active">Грядущие события</li>
<li>прошедшие мероприятия</li>
</ul>

<!-- rubric tab now -->
<div class="tabs__content active">
<!-- rubric now -->
<div id="all-rubric" umi:button-position="top right" umi:element-id="{$document-page-id}" umi:region="list" umi:module="news" umi:method="lastlist" umi:sortable="sortable">
<xsl:apply-templates select="items/item" mode="news-list" />
</div>
<!-- /rubric now -->
</div>
<!-- /rubric tab now -->

<!-- rubric tab past -->
<div class="tabs__content">
<!-- rubric past -->
<div id="all-rubric">
1 <!-- сюда должны идти новости и события, которые прошли/закончились -->
</div>
<!-- /rubric past -->
</div>
<!-- rubric tab past -->

</div>
<!-- /tabs -->
</xsl:template>


<xsl:template match="item" mode="news-list">
<xsl:variable name="date" select="document(concat('udata://system/convertDate/', @publish_time, '/(Y-m-d%20(H:i))'))/udata" />
<!-- проверяла какой alt-name вывожу -->
<xsl:value-of select="document(concat('upage://',$document-page-id))/udata/page/@alt-name" />

<div class="rubric alls-news " umi:element-id="{@id}" umi:region="row">
<a href="{@link}" umi:field-name="name" umi:delete="delete" umi:empty="&empty-page-name;" class="rubric_link">
<span class="arrow"></span>

<div class="rubric_info">
<span class="date" umi:element-id="{@id}" umi:field-name="publish_time" umi:format="Y-m-d (H:i)">
<xsl:value-of select="$date" />
</span>
<span class="rubric_topic" umi:element-id="{$document-page-id}" umi:field-name="h1" umi:region="row">
<xsl:value-of select="document(concat('upage://', $document-page-id, '.h1'))/udata/property/value" disable-output-escaping="yes" />
</span>
</div>
<div class="rubric_text" umi:field-name="anons" umi:empty="&empty-page-anons;">
<h4><xsl:value-of select="node()" /></h4>
<p umi:field-name="anons" umi:empty="&empty-page-anons;">
<xsl:value-of select=".//property[@name = 'anons']/value" disable-output-escaping="yes" />
</p>
</div>
</a>
</div>
</xsl:template>

По второму вопросу:
Как проверить, что новость/событие прошли и чтобы она выводилась в другом месте?


Спасибо.
Название: Re: Вызов рубрики и alt-name в новость, разделение на прошедшие и действующие
Отправлено: admin от 08 Декабря 2016, 22:03:12
Цитировать
Но тем же методом, который я использовала для lastlents, у меня внутри новости не получается вывести название ленты, в которой она находится, а получилось вывести название и alt-name, корневой ленты новостей...

Так как в шаблоне, который выводит новость, вы получаете alt-name запросом
<!-- проверяла какой alt-name вывожу -->
<xsl:value-of select="document(concat('upage://',$document-page-id))/udata/page/@alt-name" />
вы всегда получаете alt-name текущей страницы, так как в переменной $document-page-id содержится id текущей страницы

Вам подойдет такой вызов
<!-- проверяла какой alt-name вывожу -->
<xsl:value-of select="document(concat('upage://',@lent_id))/udata/page/@alt-name" />

А вообще, не понятно, почему для фильтрации через js вы выбрали именно alt-name атрибут и для него запускаете так много upage запросов. Можно ли использовать для этих целей id ленты новостей?

То есть, и в списке рубрик и в новостях выводить id ленты новостей
Например, в самой новости вместо alt-name делать такой запрос
<!-- проверяла какой alt-name вывожу -->
<xsl:value-of select="@lent_id" />


По поводу второго вопроса:
Есть несколько способов.
1. Если в выборке новостей (результат макроса /news/lastlist/) у вас есть все новости, проверяйте, что у них в атрибуте @publish_time и если это значение больше текущего времени в UNIX_TIMESTAMP формате то читаем их будущими новостями и наоборот.
Для этого вам потребуется текущее время в формате UNIX_TIMESTAMP . Его можно получить так:
<xsl:variable name="curr_date" select="document('udata://system/convertDate/now/U'))/udata" />

2. Делаем запрос в списку новостей, указывая временной промежуток используя 5-ый параметр в макросе /news/lastlist/ (http://dev.docs.umi-cms.ru/spravochnik_makrosov_umicms/novosti/news_lastlist/#content&sel=19:1,24:92) . Например, так вызываем только будущие новости
udata://news/lastlist/(new)/notemplate/10/0/(+ +1m)

3. Или пишем кастом)
Название: Re: Вызов рубрики и alt-name в новость, разделение на прошедшие и действующие
Отправлено: Sumrakrnd от 09 Декабря 2016, 13:31:06
Вам подойдет такой вызов
<!-- проверяла какой alt-name вывожу -->
<xsl:value-of select="document(concat('upage://',@lent_id))/udata/page/@alt-name" />

Вам сейчас покажется смешным и глупым... но я не знала, что можно вызвать id лентa >_<
Точнее что есть @lent_id...

А вообще, не понятно, почему для фильтрации через js вы выбрали именно alt-name атрибут и для него запускаете так много upage запросов. Можно ли использовать для этих целей id ленты новостей?
То есть, и в списке рубрик и в новостях выводить id ленты новостей
Например, в самой новости вместо alt-name делать такой запрос
<!-- проверяла какой alt-name вывожу -->
<xsl:value-of select="@lent_id" />

А мне alt нужен для js, т.к. фильтр работает по совпадению названий, поэтому его и брала ><

По поводу второго вопроса:
Есть несколько способов.
1. Если в выборке новостей (результат макроса /news/lastlist/) у вас есть все новости, проверяйте, что у них в атрибуте @publish_time и если это значение больше текущего времени в UNIX_TIMESTAMP формате то читаем их будущими новостями и наоборот.
Для этого вам потребуется текущее время в формате UNIX_TIMESTAMP . Его можно получить так:
<xsl:variable name="curr_date" select="document('udata://system/convertDate/now/U'))/udata" />

2. Делаем запрос в списку новостей, указывая временной промежуток используя 5-ый параметр в макросе /news/lastlist/ (http://dev.docs.umi-cms.ru/spravochnik_makrosov_umicms/novosti/news_lastlist/#content&sel=19:1,24:92) . Например, так вызываем только будущие новости
udata://news/lastlist/(new)/notemplate/10/0/(+ +1m)
Ууу... сейчас буду пробовать этот способ.
Только вопрос, можно вместо даты публикации ориентироваться на дату завершения скидки?
А то например, не все новости должны попадать в прощедшие события...
Меня спрашивали, можно ли будет если, что новость создавать задним числом, если забыли про нее и она должна висеть определенной датой


3. Или пишем кастом)
Кастом отпадает сразу, сломаю больше чем сделаю... >_<
Название: Re: Вызов рубрики и alt-name в новость, разделение на прошедшие и действующие
Отправлено: admin от 09 Декабря 2016, 13:39:51
А мне alt нужен для js, т.к. фильтр работает по совпадению названий, поэтому его и брала ><
вы можете использовать вместо alt какоето название, сгенерированное на основе id, например alt{@lent_id} (опять же чтобы upage не использовать лишний раз)

Ууу... сейчас буду пробовать этот способ.
Только вопрос, можно вместо даты публикации ориентироваться на дату завершения скидки?
А то например, не все новости должны попадать в прощедшие события...
вы можете сравнивать с любым полем типа дата, тут основной момент был в том, что идет сравнения текущей даты и даты из какого-то поля (просто дату из поля вытягивайте через extProps при вызове макроса со списком новостей)
Название: Re: Вызов рубрики и alt-name в новость, разделение на прошедшие и действующие
Отправлено: Sumrakrnd от 16 Марта 2017, 13:02:09
Ууу... сейчас буду пробовать этот способ.
Только вопрос, можно вместо даты публикации ориентироваться на дату завершения скидки?
А то например, не все новости должны попадать в прошедшие события...
вы можете сравнивать с любым полем типа дата, тут основной момент был в том, что идет сравнения текущей даты и даты из какого-то поля (просто дату из поля вытягивайте через extProps при вызове макроса со списком новостей)


Так... я наконец добралась снова до новостей сайта..

Я сделала вот такие запросы... Но что-то не так, только вот что?

Т.к. в обоих вкладках выводится одни и те же новости...
Хотя есть новости и этого числа и прошлогодние..

	<xsl:template match="result[@module = 'news'][@method = 'rubric']">

<xsl:apply-templates select="document('udata://news/lastlents/(alls-news)/notemplate/10/1/')"/>

<div class="tabs">
<xsl:apply-templates select="total" />
<ul class="tabs__caption">
<li class="active">Грядущие события</li>
<li>прошедшие мероприятия</li>
</ul>

<div class="tabs__content active">
<xsl:apply-templates select="total" />
<xsl:apply-templates select="document(concat('udata://news/lastlist/', '(1090)(1091)(1092)(1093)(1094)(1095)(1096)', '//5/(+10d-5d)/?extProps=publish_time,h1,content,news_image,anons'))/udata"
mode="upcoming" />
</div>
<div class="tabs__content">
<xsl:apply-templates select="total" />
<xsl:apply-templates select="document(concat('udata://news/lastlist/', '(1090)(1091)(1092)(1093)(1094)(1095)(1096)', '//5/(-m)/?extProps=publish_time,h1,content,news_image,anons'))/udata"
mode="pastevents" />
</div>
</div>

</xsl:template>

И пагинация не включается...
Название: Re: Вызов рубрики и alt-name в новость, разделение на прошедшие и действующие
Отправлено: Sumrakrnd от 16 Марта 2017, 14:45:33
Поменяла (-m) на (+1d-1d) вдруг не правильно что.
в-первой вкладке при +10d-5d должны быть новости не старше 5 дней и не более, чем на 10 дней от текущей даты ,так?
во-второй вкладке при (+1d-1d) должны быть новости по схеме завтра-сегодня-вчера, правильно?

Но во-второй вкладке все равно захватываются те новости, которые будут через три дня или были три дня назад
Название: Re: Вызов рубрики и alt-name в новость, разделение на прошедшие и действующие
Отправлено: Sumrakrnd от 01 Июня 2017, 13:06:43
Доброго времени суток.

Как правильно написать условие для сравнения двух дат?
В частности текущую и которая стоит в поле....
			
<xsl:variable name="time" select=".//property[@name='publish_time']/value/@unix-timestamp" />
<xsl:variable name="date_item" select="document(concat('udata://system/convertDate/', $time, '/(d.m.Y%20(H:i))'))/udata" />

<xsl:variable name="curr_date" select="document('udata://system/convertDate/now/U/(d.m.Y%20(H:i))')/udata" />
<xsl:variable name="date_now" select="document(concat('udata://system/convertDate/',$curr_date, '/(d.m.Y%20(H:i))'))/udata" />

<xsl:if test="$date & gt;= $date_now">
<xsl:value-of select="$date_now" />
</xsl:if>