Павел Романов

Павел Романов

С нами с 03 марта 2014; Место в рейтинге пользователей: #43
Павел Романов
14 ноября 2025, 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=`Популярные букеты`
]]
Павел Романов
14 ноября 2025, 18:12
0
Смотрите каким должен быть результирующий JSON и сравните с тем, что выводится. Может надо обернуть первый вызов в [ и ]:

[
[[pdoResources?
&tpl=`category_tpl`
&parents=`6`
&templates=`***` // тут ID шаблона категории 
&limit=`0`
&sortby=`{ "menuindex":"DESC"}`
&outputSeparator=`,`
]]
]
Павел Романов
14 ноября 2025, 17:42
0
Первый вызов перебирает все категории внутри каталог (6) и они выводятся как чанк category_tpl.
В этом чанке для каждой категории (категория 1 (7) и категория 2 (8)) вызывается msProducts, который выводит 16 товаров, принадлежащие данной категории ([[+id]] будет выводить 7 и 8 соответственно, что и будет передаваться в &parents=`[[+id]]`).

&templates — ограничивает выборку определенным шаблоном.
Павел Романов
14 ноября 2025, 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=`,`
]]
Павел Романов
14 ноября 2025, 17:01
0
При таком вызове выведутся 16 товаров, которые расположены ниже ресурса с id = 6.
При &limit=`0` выведутся все товары, которые находятся ниже ресурса с id = 6.

Какая у Вас структура каталога и что именно Вы хотите получить в результате?
Павел Романов
14 ноября 2025, 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"
                }
            }
        }
Павел Романов
18 октября 2025, 14:08
0
Тут нет плейсхолдера pagetitle — получайте его через $file.resource_id (для ms2Gallery) или $file.product_id (для msGallery).

{foreach $files as $file}
    <picture>
        <source srcset="{$file['webp250x250']}" type="image/webp">
        <img class="lazyload"
            data-src="{$file['webp250x250']}"
            src="{$file['webp250x250']}"
            alt="{$file.resource_id | resource : 'pagetitle' | htmlent}">
    </picture>
{/foreach}
Павел Романов
17 октября 2025, 17:30
0
А так не работает (пробелы только в & quot; уберите)?
[[+pagetitle:replace=`"==& quot ;`]]
{$pagetitle | replace : '"' : '& quot ;'}

Или можно сделать сниппет filter (он еще и кавычки-елочки ставит вместо обычных):
<?php
$str = $modx->stripTags($input);
$str = preg_replace("#([^=])\"([^\"]+)\"#", "\\1«\\2»", $str);
$arr1 = array(' & ', '"', '\'');
$arr2 = array(' & amp ; ', '& quot ;', '& apos ;');
return str_replace($arr1, $arr2, $str);

Ну и
[[+pagetitle:filter]]
{$pagetitle | filter}
Павел Романов
09 июня 2025, 15:30
0
Сорри за оффтоп, вопрос по FastPaginate.
Он присутствует в репозитории, прекрасно работает, но поддомен с примерами и документацией в настоящее время недоступен.
Это временная история или компонент более не поддерживается?

PS кстати, по ExtraFields та же история.
Павел Романов
31 мая 2025, 15:29
1
+1
Укажите для этого TV на вкладке «Параметры вывода» тип «Разделитель» и в качестве него поставьте ||.
Павел Романов
01 мая 2025, 12:51
1
+1
Речь идет об item.tpl?
Обычным образом:
[[*id]]
[[*template]]

Если на Fenom, то
{$_modx->resource.id}
{$_modx->resource.template}
Павел Романов
21 апреля 2025, 12:44
0
Здравствуйте.
Первой должна идти колонка «Категории»
Павел Романов
05 апреля 2025, 12:12
+1
Если в этом поле числа, то можно так:
...
&tvFilters=`count_all>0`
...

Если нет, то попробуйте так:
...
&includeTVs=`count_all`
&where=`{ "count_all:!=":"" }`
...

Ну или сделайте сниппет, который будет собирать ID товаров, у которых поле пустое, выдавать их в виде строки типа:…
-15,-12,-56

… и подставьте его в качестве resources:
...
&resources=`[[snippetName]]`
...
Павел Романов
14 марта 2025, 10:32
0
Здравствуйте

префиксы таблиц, точно они ms2_
Поправил, спасибо за уточнение ).

А почему выбрал CronManager
Просто обычно работаю с CronManager, но ничего не мешает запускать тот же самый сниппет через Scheduler.

Добавляем задание:



Настраиваем параметры:



Результат:

Павел Романов
03 марта 2025, 22:42
0
Это у Вас что-то не так ).
Смотрите логи сервера.
Павел Романов
03 марта 2025, 22:41
0
Так в них и выводите. В $category будет ID не родителя, а категории первого уровня.
То есть если у Вас так:…
  • Ракеты (1)
    • Подкатегория 1 (2)
      • Товар 1 (3)
      • Товар 2 (4)
      • Товар 3 (5)
      • Подкатегория 2 (6)
        • Товар 4 (7)
        • Товар 5 (8)

… то для всех подкатегорий и товаров $category будет 1 (ID Ракеты) вне зависимости от вложенности.
Павел Романов
03 марта 2025, 10:40
0
Для получения id верхней категории можно использовать pdoField, а дальше разводить. Если Ракеты, Арбузы, Магия находятся в корне (уровень указывается в topLevel), то так:
{var $category = 'pdoField' | snippet : ['topLevel' => 1, 'field' => 'id']}
{$category == 1}
    {include 'arbuzi'}
{elseif $category == 25}
    {include 'raketi'}
{elseif $category == 100}
    {include 'magic'}
{else}
{/if}