Как вывести последние добавленные товары в каталоге UMI.CMS

Нужно мне было вывести последние добавленные товары в интернет магазине на движке UMI.CMS. Некоторое время я убил на освоение этого способа. Дело в том, что, например, для того, чтобы вывести последние добавленные новости есть стандартная функция udata://news/lastlist/. Для каталога такого нет, но можно воспользоваться следующим способом:
1) В типе данных товара (модуль Шаблоны данных) добавляется поле «Дата добавления» с идентификатором publish_time и типом данных Дата. В результате чего, при добавлении и каждом последующем обновлении или редактировании товара, в поле «Дата добавления» будет автоматически записываться текущее время.
2) Далее нам нужно настроить сортировку по этому полю. В этом нам поможет функция udata://catalog/getObjectsList/ :
При использовании функции udata://catalog/getObjectsList/ объекты каталога выводятся в том порядке, в котором они расположены в административной панели. Синтаксис:
1 | catalog getObjectsList( [template = 'default', category_id = false, limit = false, ignore_paging = false, i_need_deep = 0, field_id = false, asc = true]) |
Чтобы сортировка производилась не по умолчанию, а по нужному нам полю, необходимо указать в качестве параметра field_id id нужного поля, по которому необходимо сортировать. Важно, чтобы поля, находящиеся перед этим полем, тоже были заполнены. Например запись вида:
1 | udata://catalog/getObjectsList/notemplate/(/rus/medicine/)/12/0/2/publish_time/1 |
выведет товары в каталоге на одной странице с сортировкой по publish_time по возрастанию. Чтобы сделать сортировку по убыванию, меняем последний параметр:
1 | udata://catalog/getObjectsList/notemplate/(/rus/medicine/)/12/0/2/publish_time/1 |
0 — соответствует значению false, 1 — соответствует true.
Итак, в шаблоне у нас получается следующий код:
1 2 3 | <xsl:template match="result[page/@is-default = '1']" priority="1"> <xsl:apply-templates select="document('udata://catalog/getObjectsList/notemplate/(/rus/medicine/)/12/0/2/publish_time/0')" mode="last-medicine" /> </xsl:template> |
который вызывает XML вида:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | <udata module="catalog" method="getObjectsList" generation-time="0.031301"> <lines> <item id="90" alt_name="vitamin-c" link="/rus/medicine/influenza/vitamin-c/" xlink:href="upage://90">Витамин C</item> <item id="92" alt_name="amixin-ic" link="/rus/medicine/influenza/amixin-ic/" xlink:href="upage://92">Амиксин IC</item> <item id="97" alt_name="denebol-gel" link="/rus/medicine/pain-relief/denebol-gel/" xlink:href="upage://97">Денебол Гель</item> <item id="113" alt_name="aponil" link="/rus/medicine/pain-relief/aponil/" xlink:href="upage://113">Апонил</item> <item id="98" alt_name="voltaren-emulgel" link="/rus/medicine/pain-relief/voltaren-emulgel/" xlink:href="upage://98">Вольтарен Эмульгель</item> <item id="114" alt_name="nurofen" link="/rus/medicine/pain-relief/nurofen/" xlink:href="upage://114">Нурофен</item> <item id="99" alt_name="voltaren" link="/rus/medicine/pain-relief/voltaren/" xlink:href="upage://99">Вольтарен</item> <item id="115" alt_name="ibuprom-max" link="/rus/medicine/pain-relief/ibuprom-max/" xlink:href="upage://115">Ибупром Макс</item> <item id="100" alt_name="gripex-hot-effect" link="/rus/medicine/influenza/gripex-hot-effect/" xlink:href="upage://100">Гриппекс Хот Эффект</item> <item id="116" alt_name="ibuprofen" link="/rus/medicine/pain-relief/ibuprofen/" xlink:href="upage://116">Ибупрофен</item> <item id="101" alt_name="unguentum-bom-benge" link="/rus/medicine/pain-relief/unguentum-bom-benge/" xlink:href="upage://101">Бом-Бенге мазь</item> <item id="117" alt_name="deep-relief" link="/rus/medicine/pain-relief/deep-relief/" xlink:href="upage://117">Дип рилиф</item> </lines> <numpages> <items> <item link="?p=0" page-num="0" is-active="1">1</item> <item link="?p=1" page-num="1">2</item> <item link="?p=2" page-num="2">3</item> <item link="?p=3" page-num="3">4</item> </items> <toend_link page-num="3">?p=3</toend_link> <tonext_link page-num="1">?p=1</tonext_link> <current-page>0</current-page> </numpages> <total>38</total> <per_page>12</per_page> <category_id>49</category_id> <type_id>117</type_id> </udata> |
Вот такой вот набор данных, в котором нам нужны только значения, находящиеся в //lines, поэтому выводим эту информацию следующим шаблоном:
1 2 3 4 5 6 7 | <xsl:template match="udata" mode="last-medicine"> <div> <div umi:element-id="{page[@parentId > 0]/@parentId}" umi:module="catalog" umi:method="getObjectsList" umi:region="list" umi:add-method="none"> <xsl:apply-templates select="//lines" mode="short-view"></xsl:apply-templates> </div> </div> </xsl:template> |
Готово. Код выводит последние добавленные или обновленные товары. Если найдете способ вывести только последние добавленные — welcome в камменты.
А как то же самое сделать на tpl?
С tpl предпочитаю не связываться и Вам не советую, потому что это очень «деревянная» и тупиковая технология. Не тратьте на неё своё время. А если сайт уже на tpl… чтож… соболезную.
Супер совет, видно сразу, профессионал…
Например я хочу вывести последние 20 товаров во всем каталоге. У меня есть каталог с категориями (5 вложенности). Если я хочу искать по всему каталогу то придется использовать i_need_deep и искать от корня, но сортировка работает только внутри категории. Единственный выход это отдельно получать список категорий и внутри каждой категории находить «новые» товары.
Я бы для данной задачи либо писал кастомный метод, либо использовал usel.