Сортировка содержимого страниц через menuindex в MODX REVO
Есть древо ресурсов (товаров) TV поля которых тянутся в каталог товаров. Нужно, что-бы на странице в каталоге товаров товары распологались так же, как и в древе в админке.
Древо выглядит так:
Вызов TV полей сейчас выглядит так:
Для удобства добавлю код:
<div class="item__container1">
<div class="item">
<h3 class="item__title">[[!getTV?id=`4` &tv=`149`]]</h3>
<div class="description__container">
<span class="description-stick">|</span><p class="item__desc">[[!getTV?id=`4` &tv=`84`]]</p>
</div>
<a href="/catalog/tzi-eco/" class="item__src">Подробнее</a>
</div>
<div class="item-img__container1">
<img src="[[!getTV?id=`4` &tv=`146`]]" alt="Item-eco Image" class="item-img1-1 _anim-items">
<img src="img/item-arrow-left.png" alt="Arrow-left image" class="arrow-left-img _anim-items">
<div class="bg-item1 _anim-items">
<img src="[[!getTV?id=`4` &tv=`147`]]" alt="Item-eco Material" class="item-img1-2">
</div>
</div>
</div>
Стандартное решение позволяет мне сделать сортировку при помощи pdoResources, создав один единственный чанк и сортировку через "menuindex". Код:
[[!getResources?
&tpl=`tpl_name`
&parents=`3`
&depth=`0`
&sortby=`{"menuindex":"ASC"}`
]]
Но я столкнулся с проблемой т.к. в моём случае все шесть товаров размещены в разных блоках с разными стилями в разных "условиях" на странице. Таким образом создать единый чанк я не могу, и менять могу только содержимое самих TV полей. Мне нужно тянуть TV поле именно нужной страницы в нужное место. Товаров будет 6, это число неизменно.
Возможно ли создать вызов поля по индексу в списке? В каталоге 6 товаров, пусть это массив от 1 до 6. Товар на первом месте имеет индекс 1 и так далее. Таким образом при вызове TV поля могу ли я сделать что-то вида:
[[!getTV?&parents=`3` &index(индекс в списке)=`1` &tv=`146`]]
Вызов getTV (который используется сейчас) работает через сниппет, найденый мною на просторах интернета:
<?php
if (isset($id) && isset($tv)) {
$obj = $modx->getObject('modResource', $id);
if ($obj) {
return $obj->getTVValue($tv);
}
}
В общем то, я готов тянуть TV поля даже через pdoResources по штуке в каждом TV поле, учитывая что товаров всего 6 (и расширяться не будет), нагрузка не будет такой прям колоссальной. Вопрос только в том, есть ли такая возможность, выбирать индекс из списка.
А если нет, может ли кто-то дописать в сниппет выборку из индекса?
Ответы (1 шт):
Решение весьма простое оказалось, хоть и полагаю костыльное (добавил комментарии в код для более простого объяснения. При использовании нужно их удалить.)
[[pdoResources?
&parents=`3` /* Родитель */
&resources=`16,4,20,17,18,19` /* Все ресурсы */
&tpl=`item__container1` /* Чанк */
&includeTVs=`Name Item, Desc prev, Main Image, mat-image` /* TV Поля */
&sortby=`{"menuindex":"ASC"}` /* Сортировка по расположению ресурсов в каталоге */
&offset=`от 1 до 5` /* Игнорирование ресурсов от 1 до 5 */
&limit=`1` /* Кол-во выводимых ресурсов */
]]
Поясняю: Я указал родителя, после чего прописал все ресурсы имеющиеся в родителе. Дальше я беру первый айтем и помещаю его в чанк. Объявляю все TV поля и уже на этом этапе можно выводить. Но в таком случае я получаю 6 чанков с TV полями со всех ресурсов. Дальше я задаю сортировку по "menuindex(сортировка по индексу в каталоге)". Задаю лимит равный 1 и получаю только 1 чанк с TV полями из первого ресурса.
Дальше создаю ещё 5 чанков и выношу в них так же все айтемы. После чего делаю вызов на каждый айтем, но со второго уже задаю параметр offset(игнорирует n-ое кол-во ресурсов указанное в параметре) Если рассматривать вывод второго айтема(товара), то я указываю offset='1', получая таким образом 2-3-4-5-6 ресурсы, но т.к. выставлен лимит в 1 ресурс, получаю я только ресурс, находящийся на 2 месте. Остальные 4 по накатанной.
