GetResorce, lastTpl и offset/idx

Желаю здравия!

имеется вот такая вот связка:

[[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. в коде могут быть не состыковки, т.к. перепробовал разные варианты, и не по одному разу, поэтому тут скорее черновик, а не чистовик.
Дмитрий
Вчера в 01:28
modx.pro
123
0

Комментарии: 14

Павел Романов
Вчера в 12:14
0
А почему не сделать так:

[[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"
                }
            }
        }
    Дмитрий
    Вчера в 16:50
    0
    [[msProducts?
    &tpl=`razmetka-tovarov`
    &parents=`6`
    &templates=`***` // тут ID шаблона товара 
    &limit=`16`
    &offset=`0`
    &sortby=`{ "menuindex":"DESC"}`
    &outputSeparator=`,`
    ]]
    Плохой вариант, при таком раскладе у меня выведется из первой подпапки 16 позиций, что будет явно противоречить действительности.
      Павел Романов
      Вчера в 17:01
      0
      При таком вызове выведутся 16 товаров, которые расположены ниже ресурса с id = 6.
      При &limit=`0` выведутся все товары, которые находятся ниже ресурса с id = 6.

      Какая у Вас структура каталога и что именно Вы хотите получить в результате?
        Дмитрий
        Вчера в 17:16
        0
        каталог (6)
        ----категория 1 (7)
        --------товары около 100 шт
        ----категория 2 (8)
        --------товары около 100 шт
        и так далее

        мне нужно вывести из каждой категории по 16 товаров

        у меня это реализовано, скажем так, циклом в цикле
          Павел Романов
          Вчера в 17:28
          0
          Тогда так:

          [[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=`,`
          ]]
            Дмитрий
            Вчера в 17:31
            0
            Не совсем понимаю, что это даст? не могли бы вы обьяснить?

            И вот еще что, в описании pdoResources не нашел &templates… что это дает?
              Павел Романов
              Вчера в 17:42
              0
              Первый вызов перебирает все категории внутри каталог (6) и они выводятся как чанк category_tpl.
              В этом чанке для каждой категории (категория 1 (7) и категория 2 (8)) вызывается msProducts, который выводит 16 товаров, принадлежащие данной категории ([[+id]] будет выводить 7 и 8 соответственно, что и будет передаваться в &parents=`[[+id]]`).

              &templates — ограничивает выборку определенным шаблоном.
              Дмитрий
              Вчера в 17:39
              0
              аааа! я наверное догадался=)

              &outputSeparator=`,` добавит запятую после каждого прохода цикла?
                Павел Романов
                Вчера в 17:43
                0
                да
                  Дмитрий
                  Вчера в 18:01
                  0
                  План был хорош, но почему-то валидатор от гугла ругается именно на эту запятую =)
                  т.е. по всей видимости, pdoResources подставляет эту запятую в каком-то своем формате. =(

                  Вот чего говорит: Ошибка анализа: в декларации массива отсутствует символ "," или "]", хотя сам код выглядит, так как нужно
                    Павел Романов
                    Вчера в 18:12
                    0
                    Смотрите каким должен быть результирующий JSON и сравните с тем, что выводится. Может надо обернуть первый вызов в [ и ]:

                    [
                    [[pdoResources?
                    &tpl=`category_tpl`
                    &parents=`6`
                    &templates=`***` // тут ID шаблона категории 
                    &limit=`0`
                    &sortby=`{ "menuindex":"DESC"}`
                    &outputSeparator=`,`
                    ]]
                    ]
                      Дмитрий
                      Вчера в 18:21
                      0
                      не, до этого я так же проверял, гугл-валидатором, все было в норме, ругался на наличие последней запятой. А тут ругается на запятую, которая идет сразу после первого же товара.
                      А то как пишете вы, у меня так и сделано…

                      <!-- Разметка популярных товаров -->
                      <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`
                          ]]
                        ]
                          }
                        Павел Романов
                        Вчера в 19:50
                        0
                        Да, msProducts почему-то в конце ставит лишнюю запятую.
                        Тогда сделайте сниппет 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=`Популярные букеты`
                        ]]
      Дмитрий
      Вчера в 17:20
      0
      Кстати, как я писал выше, если я буду использовать &offset, то перестает работать функция tplLast, а для меня она важна
      Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
      14