Skip to content
Reactions
Reactions
Универсальная система реакций для MODX 3 — лайки, наборы в стиле GitHub, топы и trending на любом объекте
  1. Компоненты
  2. Reactions
  3. Интеграции
  4. miniShop3

Интеграция с miniShop3

В сниппетах и API передавайте короткий класс msProduct и ID товара (&object= / object_id). Сервер находит товар через FQCN (MiniShop3\Model\msProduct) и STI modResource, короткое имя в xPDO не дергает — без шума в error.log.

В агрегатах поле object_class хранится как msProduct (то, что вы передали в class / class_key). Join в каталоге стройте по этой же строке.

Блок реакций на карточке товара

github в режиме picker (чипы + +):

modx
[[!Reactions?
    &class=`msProduct`
    &object=`[[*id]]`
    &set=`github`
    &context=`web`
]]
fenom
{'!Reactions' | snippet : [
    'class'   => 'msProduct',
    'object'  => $product.id,
    'set'     => 'github',
    'context' => 'web',
]}

Только 👍/👎:

modx
[[!Reactions?
    &class=`msProduct`
    &object=`[[*id]]`
    &set=`updown`
]]

Счётчик в каталоге

modx
[[!ReactionsCount?
    &class=`msProduct`
    &object=`[[+id]]`
    &format=`👍 {LIKES}`
]]
fenom
{'!ReactionsCount' | snippet : [
    'class'  => 'msProduct',
    'object' => $product.id,
    'format' => '👍 {LIKES}',
]}

Сортировка каталога по популярности

Через msProducts и leftJoin.

json
[[!msProducts?
    &parents=`10`
    &limit=`12`
    &leftJoin=`{"Aggregate":{"class":"Reactions\\Model\\ReactionAggregate","on":"Aggregate.object_id = msProduct.id AND Aggregate.object_class = 'msProduct'"}}`
    &sortby=`Aggregate.likes`
    &sortdir=`DESC`
    &tpl=`tpl.msProduct.card`
]]
json
{'!msProducts' | snippet : [
    'parents' => 10,
    'limit' => 12,
    'leftJoin' => '{"Aggregate":{"class":"Reactions\\Model\\ReactionAggregate","on":"Aggregate.object_id = msProduct.id AND Aggregate.object_class = \'msProduct\'"}}',
    'sortby' => 'Aggregate.likes',
    'sortdir' => 'DESC',
    'tpl' => 'tpl.msProduct.card',
]}

Топ товаров

modx
[[!TopLiked?
    &class=`msProduct`
    &period=`month`
    &limit=`6`
    &tpl=`tpl.top.product`
]]
fenom
{'!TopLiked' | snippet : [
    'class'  => 'msProduct',
    'period' => 'month',
    'limit'  => 6,
    'tpl'    => 'tpl.top.product',
]}

Трендовые товары:

modx
[[!Trending?
    &class=`msProduct`
    &limit=`8`
]]
fenom
{'!Trending' | snippet : [
    'class' => 'msProduct',
    'limit' => 8,
]}

Счётчик в чанке msProducts

В tpl.msProduct.card:

modx
<div class="product-card">
    <h3>[[+pagetitle]]</h3>
    <p class="product-price">[[+price]] ₽</p>
    [[!ReactionsCount?
        &class=`msProduct`
        &object=`[[+id]]`
        &format=`❤️ {TOTAL}`
    ]]
</div>
fenom
<div class="product-card">
    <h3>{$pagetitle}</h3>
    <p class="product-price">{$price} ₽</p>
    {'!ReactionsCount' | snippet : [
        'class'  => 'msProduct',
        'object' => $id,
        'format' => '❤️ {TOTAL}',
    ]}
</div>

Контекст

Товары обычно живут в контексте web. Если каталог в отдельном контексте, передайте context:

modx
[[!Reactions?
    &class=`msProduct`
    &object=`[[*id]]`
    &context=`catalog`
    &set=`updown`
]]
fenom
{'!Reactions' | snippet : [
    'class'   => 'msProduct',
    'object'  => $product.id,
    'context' => 'catalog',
    'set'     => 'updown',
]}

JSON-LD на карточке товара

Только при наличии like/dislike у товара. В Fenom — через {raw …}:

modx
[[!ReactionsSchema?
    &class=`msProduct`
    &object=`[[*id]]`
    &context=`web`
]]
fenom
{raw ('!ReactionsSchema' | snippet : [
    'class'   => 'msProduct',
    'object'  => $product.id,
    'context' => 'web',
])}

Пересчёт агрегатов

После миграции или импорта:

bash
php core/components/reactions/cli.php recount --class-key=msProduct