GetResorce, lastTpl и offset/idx
Желаю здравия!
имеется вот такая вот связка:
tovaru-schema
В дескрипшене:
моя задача сгенерировать application/ld+json
чанк razmetka-tovarov
И все, супер, и все здорово, и все работает как надо, за исключением одной маленькой детали.
Если я вызываю сниппет со значением idx или offset (что тоже меня вполне устраивает) у меня перестает работать lastTpl, а она мне нужна, т.к. в конце application/ld+json не должно быть запятушечки!
Что делать? куда бежать? =)
Помогите, пожалуйста!
p.s. в коде могут быть не состыковки, т.к. перепробовал разные варианты, и не по одному разу, поэтому тут скорее черновик, а не чистовик.
имеется вот такая вот связка:
[[getResources?
&parents=`6`
&tpl=`tovaru-schema`
&includeContent=`1`
&includeTVs=`1`
&sortby=`{"menuindex":"ASC"}`
&limit=`0`
&depth=`0`
]]tovaru-schema
[[+description]]Т.е. с помощью первого гетресорса, я вызываю, то что есть в папке с индексом 6, но выбираю от туда только дескрипшен.[[!pdoPage?
&element=`msProducts`
&tpl=`razmetka-tovarov`
&tplLast=`razmetka-tovarov-last`
&parents=`7`
&limit=`16`
&sortbyTV=`new`
&sortdirTV=`DESC`
&sortby=`{ "menuindex":"DESC"}`
&idx=`[[+lastIdx]]`
]]Собственно, дескпришен сделаны по аналогии, меняется лишь &parents=`7` моя задача сгенерировать application/ld+json
чанк razmetka-tovarov
{set $count=$idx}
{if $idx >= 16}
{set $count=$count+1}
{$_modx->setPlaceholder('lastIdx', $count)}
{/if}
{
"@type": "ListItem",
"position": [[+idx]],
"item": {
"@type": "Product",
"@id": "https://mydomain.ru/[[~[[+id]]]]",
"name": "[[+pagetitle]]",
"image": "https://mydomainru{$thumb}",
"description": "[[+description]]",
"offers": {
"@type": "Offer",
"url": "https://mydomain/[[~[[+id]]]]",
"priceCurrency": "RUB",
"price": "{$price | replace : " " : ""}",
"availability": "https://schema.org/InStock"
}
}
}
},поясню за эту часть:{set $count=$idx}
{if $count >= 16}
{set $count=$count+1}
{$_modx->setPlaceholder('lastIdx', $count)}
{/if}Т.к. у меня один вызов вложен в другой, и каждый новый вызов обнуляет значение idx, приходится лепить костыль для idx.И все, супер, и все здорово, и все работает как надо, за исключением одной маленькой детали.
Если я вызываю сниппет со значением idx или offset (что тоже меня вполне устраивает) у меня перестает работать lastTpl, а она мне нужна, т.к. в конце application/ld+json не должно быть запятушечки!
Что делать? куда бежать? =)
Помогите, пожалуйста!
p.s. в коде могут быть не состыковки, т.к. перепробовал разные варианты, и не по одному разу, поэтому тут скорее черновик, а не чистовик.
Комментарии: 14
А почему не сделать так:
В чанке просто:
[[msProducts?
&tpl=`razmetka-tovarov`
&parents=`6`
&templates=`***` // тут ID шаблона товара
&limit=`16`
&offset=`0`
&sortby=`{ "menuindex":"DESC"}`
&outputSeparator=`,`
]]Если надо используйте &offset в вызове для сдвига выборки.В чанке просто:
{
"@type": "ListItem",
"position": [[+idx]],
"item": {
"@type": "Product",
"@id": "https://mydomain.ru/[[~[[+id]]]]",
"name": "[[+pagetitle]]",
"image": "https://mydomainru{$thumb}",
"description": "[[+description]]",
"offers": {
"@type": "Offer",
"url": "https://mydomain/[[~[[+id]]]]",
"priceCurrency": "RUB",
"price": "{$price | replace : " " : ""}",
"availability": "https://schema.org/InStock"
}
}
} [[msProducts?
&tpl=`razmetka-tovarov`
&parents=`6`
&templates=`***` // тут ID шаблона товара
&limit=`16`
&offset=`0`
&sortby=`{ "menuindex":"DESC"}`
&outputSeparator=`,`
]]Плохой вариант, при таком раскладе у меня выведется из первой подпапки 16 позиций, что будет явно противоречить действительности.
При таком вызове выведутся 16 товаров, которые расположены ниже ресурса с id = 6.
При &limit=`0` выведутся все товары, которые находятся ниже ресурса с id = 6.
Какая у Вас структура каталога и что именно Вы хотите получить в результате?
При &limit=`0` выведутся все товары, которые находятся ниже ресурса с id = 6.
Какая у Вас структура каталога и что именно Вы хотите получить в результате?
каталог (6)
----категория 1 (7)
--------товары около 100 шт
----категория 2 (8)
--------товары около 100 шт
и так далее
мне нужно вывести из каждой категории по 16 товаров
у меня это реализовано, скажем так, циклом в цикле
----категория 1 (7)
--------товары около 100 шт
----категория 2 (8)
--------товары около 100 шт
и так далее
мне нужно вывести из каждой категории по 16 товаров
у меня это реализовано, скажем так, циклом в цикле
Тогда так:
Чанк category_tpl:
[[pdoResources?
&tpl=`category_tpl`
&parents=`6`
&templates=`***` // тут ID шаблона категории
&limit=`0`
&sortby=`{ "menuindex":"DESC"}`
&outputSeparator=`,`
]]Чанк category_tpl:
[[msProducts?
&tpl=`razmetka-tovarov`
&parents=`[[+id]]`
&templates=`***` // тут ID шаблона товара
&limit=`16`
&sortby=`{ "menuindex":"DESC"}`
&outputSeparator=`,`
]]
Не совсем понимаю, что это даст? не могли бы вы обьяснить?
И вот еще что, в описании pdoResources не нашел &templates… что это дает?
И вот еще что, в описании pdoResources не нашел &templates… что это дает?
Первый вызов перебирает все категории внутри каталог (6) и они выводятся как чанк category_tpl.
В этом чанке для каждой категории (категория 1 (7) и категория 2 (8)) вызывается msProducts, который выводит 16 товаров, принадлежащие данной категории ([[+id]] будет выводить 7 и 8 соответственно, что и будет передаваться в &parents=`[[+id]]`).
&templates — ограничивает выборку определенным шаблоном.
В этом чанке для каждой категории (категория 1 (7) и категория 2 (8)) вызывается msProducts, который выводит 16 товаров, принадлежащие данной категории ([[+id]] будет выводить 7 и 8 соответственно, что и будет передаваться в &parents=`[[+id]]`).
&templates — ограничивает выборку определенным шаблоном.
аааа! я наверное догадался=)
&outputSeparator=`,` добавит запятую после каждого прохода цикла?
&outputSeparator=`,` добавит запятую после каждого прохода цикла?
да
План был хорош, но почему-то валидатор от гугла ругается именно на эту запятую =)
т.е. по всей видимости, pdoResources подставляет эту запятую в каком-то своем формате. =(
Вот чего говорит: Ошибка анализа: в декларации массива отсутствует символ "," или "]", хотя сам код выглядит, так как нужно
т.е. по всей видимости, pdoResources подставляет эту запятую в каком-то своем формате. =(
Вот чего говорит: Ошибка анализа: в декларации массива отсутствует символ "," или "]", хотя сам код выглядит, так как нужно
Смотрите каким должен быть результирующий JSON и сравните с тем, что выводится. Может надо обернуть первый вызов в [ и ]:
[
[[pdoResources?
&tpl=`category_tpl`
&parents=`6`
&templates=`***` // тут ID шаблона категории
&limit=`0`
&sortby=`{ "menuindex":"DESC"}`
&outputSeparator=`,`
]]
]
не, до этого я так же проверял, гугл-валидатором, все было в норме, ругался на наличие последней запятой. А тут ругается на запятую, которая идет сразу после первого же товара.
А то как пишете вы, у меня так и сделано…
А то как пишете вы, у меня так и сделано…
<!-- Разметка популярных товаров -->
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "ItemList",
"name": "Популярные букеты",
"itemListOrder": "https://schema.org/ItemListOrderAscending",
"itemListElement": [
[[getResources?
&parents=`6`
&tpl=`tovaru-schema`
&includeContent=`1`
&includeTVs=`1`
&sortby=`{"menuindex":"ASC"}`
&limit=`0`
&depth=`0`
]]
]
}
Да, msProducts почему-то в конце ставит лишнюю запятую.
Тогда сделайте сниппет getJson:
Создайте чанк razmetka_wrapper:
И вызывайте (в чанке razmetka-tovarov в конце не должно быть запятой):
Тогда сделайте сниппет getJson:
<?php
$pdo = $modx->getService('pdoFetch');
$categories = $pdo->getCollection('modResource', ['parent' => $parent,'template' => $catTemplate],['limit' => 0]);
$prods = [];
$i = 1;
foreach ($categories as $category) {
$products = $modx->runSnippet('msProducts',[
'parents' => $category['id'],
'templates' => $prodTemplate,
'limit' => $limit,
'sortby' => '{ "menuindex":"DESC" }',
'return' => 'json'
]);
$products = json_decode($products,1);
foreach($products as $product){
$product['idx'] = $i;
$prods[] = $pdo->getChunk($tpl,$product);
$i++;
}
}
$prods = implode(',',$prods);
$out = $pdo->getChunk($tplWrapper, ['name' => $name, 'output' => $prods]);
return $out;Создайте чанк razmetka_wrapper:
<!-- Разметка популярных товаров -->
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "ItemList",
"name": "[[+name]]",
"itemListOrder": "https://schema.org/ItemListOrderAscending",
"itemListElement": [
[[+output]]
]
}
</script>И вызывайте (в чанке razmetka-tovarov в конце не должно быть запятой):
[[getJson?
&parent=`6`
&catTemplate=`***` // ID шаблона категории
&prodTemplate=`***` // ID шаблона товара
&limit=`16`
&tpl=`razmetka-tovarov`
&tplWrapper=`razmetka_wrapper`
&name=`Популярные букеты`
]]
Кстати, как я писал выше, если я буду использовать &offset, то перестает работать функция tplLast, а для меня она важна
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.