Курс 2016 года “Разработка на UMI.CMS от 0 до готового сайта”
Вызов макроса из кастомного макроса.

Автор niakrissРаздел Макросы UMI.CMS

Ответов: 4
Просмотров: 3923
Последний ответ 21 Октября 2013, 10:47:10
от niakriss
XSLT: вызов существующего раздела из вновь созданной пустой старницы

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

Ответов: 9
Просмотров: 3261
Последний ответ 16 Ноября 2014, 23:19:20
от admin
Вызов шаблона работает только под админом

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

Ответов: 2
Просмотров: 2771
Последний ответ 22 Марта 2015, 18:34:19
от admin
Вызов макроса в макросе. Порядок интерпретации.

Автор psw2020Раздел Макросы UMI.CMS

Ответов: 7
Просмотров: 3281
Последний ответ 28 Декабря 2015, 16:53:22
от psw2020
XSLT: вызов контента страницы

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

Ответов: 3
Просмотров: 1864
Последний ответ 18 Ноября 2014, 00:47:57
от sam

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

*

Sumrakrnd

  • ****
  • 311
  • +1/-0
  • Учусь «на примерах»
    • Просмотр профиля
Доброго времени суток.

Создала страницу новостей
Вывела новости, рубрики в которых они находятся, их 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>

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


Спасибо.
« Последнее редактирование: 08 Декабря 2016, 13:05:02 от Sumrakrnd »

*

admin

  • *****
  • 2444
  • +172/-1
    • Просмотр профиля
Цитировать
Но тем же методом, который я использовала для 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/ . Например, так вызываем только будущие новости
udata://news/lastlist/(new)/notemplate/10/0/(+ +1m)

3. Или пишем кастом)
« Последнее редактирование: 08 Декабря 2016, 22:05:46 от admin »

*

Sumrakrnd

  • ****
  • 311
  • +1/-0
  • Учусь «на примерах»
    • Просмотр профиля
Вам подойдет такой вызов
<!-- проверяла какой 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/ . Например, так вызываем только будущие новости
udata://news/lastlist/(new)/notemplate/10/0/(+ +1m)
Ууу... сейчас буду пробовать этот способ.
Только вопрос, можно вместо даты публикации ориентироваться на дату завершения скидки?
А то например, не все новости должны попадать в прощедшие события...
Меня спрашивали, можно ли будет если, что новость создавать задним числом, если забыли про нее и она должна висеть определенной датой


3. Или пишем кастом)
Кастом отпадает сразу, сломаю больше чем сделаю... >_<

*

admin

  • *****
  • 2444
  • +172/-1
    • Просмотр профиля
А мне alt нужен для js, т.к. фильтр работает по совпадению названий, поэтому его и брала ><
вы можете использовать вместо alt какоето название, сгенерированное на основе id, например alt{@lent_id} (опять же чтобы upage не использовать лишний раз)

Ууу... сейчас буду пробовать этот способ.
Только вопрос, можно вместо даты публикации ориентироваться на дату завершения скидки?
А то например, не все новости должны попадать в прощедшие события...
вы можете сравнивать с любым полем типа дата, тут основной момент был в том, что идет сравнения текущей даты и даты из какого-то поля (просто дату из поля вытягивайте через extProps при вызове макроса со списком новостей)

*

Sumrakrnd

  • ****
  • 311
  • +1/-0
  • Учусь «на примерах»
    • Просмотр профиля
Ууу... сейчас буду пробовать этот способ.
Только вопрос, можно вместо даты публикации ориентироваться на дату завершения скидки?
А то например, не все новости должны попадать в прошедшие события...
вы можете сравнивать с любым полем типа дата, тут основной момент был в том, что идет сравнения текущей даты и даты из какого-то поля (просто дату из поля вытягивайте через 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>

И пагинация не включается...

*

Sumrakrnd

  • ****
  • 311
  • +1/-0
  • Учусь «на примерах»
    • Просмотр профиля
Поменяла (-m) на (+1d-1d) вдруг не правильно что.
в-первой вкладке при +10d-5d должны быть новости не старше 5 дней и не более, чем на 10 дней от текущей даты ,так?
во-второй вкладке при (+1d-1d) должны быть новости по схеме завтра-сегодня-вчера, правильно?

Но во-второй вкладке все равно захватываются те новости, которые будут через три дня или были три дня назад

*

Sumrakrnd

  • ****
  • 311
  • +1/-0
  • Учусь «на примерах»
    • Просмотр профиля
Доброго времени суток.

Как правильно написать условие для сравнения двух дат?
В частности текущую и которая стоит в поле....
			
<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>