
Reactions
Универсальная система реакций для MODX 3 — лайки, наборы в стиле GitHub, топы и trending на любом объекте


Реакции на ресурсы Collections работают как на обычных modResource. Collections не требует отдельного class_key.
[[!Reactions? &set=`github`]]{'!Reactions' | snippet : ['set' => 'github', 'object' => $_modx->resource.id]}<article class="collection-item">
<h2><a href="[[~[[+id]]]]">[[+pagetitle]]</a></h2>
[[!ReactionsCount?
&object=`[[+id]]`
&format=`👍 {LIKES} · 💬 {TOTAL}`
]]
</article><article class="collection-item">
<h2><a href="{$id | url}">{$pagetitle}</a></h2>
{'!ReactionsCount' | snippet : [
'object' => $id,
'format' => '👍 {LIKES} · 💬 {TOTAL}',
]}
</article>Через pdoResources с leftJoin на ReactionAggregate.
[[!pdoResources?
&parents=`[[*id]]`
&depth=`1`
&leftJoin=`{"Aggregate":{"class":"Reactions\\Model\\ReactionAggregate","on":"Aggregate.object_id = modResource.id AND Aggregate.object_class = 'modResource'"}}`
&sortby=`Aggregate.likes`
&sortdir=`DESC`
&tpl=`@INLINE <li><a href="[[+uri]]">[[+pagetitle]]</a> — [[!ReactionsCount? &object=`[[+id]]` &format=`{LIKES}`]]</li>`
]]{'!pdoResources' | snippet : [
'parents' => $_modx->resource.id,
'depth' => 1,
'leftJoin' => '{"Aggregate":{"class":"Reactions\\Model\\ReactionAggregate","on":"Aggregate.object_id = modResource.id AND Aggregate.object_class = \'modResource\'"}}',
'sortby' => 'Aggregate.likes',
'sortdir' => 'DESC',
'tpl' => '@INLINE <li><a href="[[+uri]]">[[+pagetitle]]</a> — [[!ReactionsCount? &object=`[[+id]]` &format=`{LIKES}`]]</li>',
]}Ограничьте выборку родителем через pdoResources, а не через TopLiked напрямую. TopLiked сортирует глобально по class_key, без фильтра по родителю.
Вариант: pdoResources + sortby Aggregate.likes (см. выше).
Глобальный топ (все ресурсы контекста):
[[!TopLiked?
&class=`modResource`
&period=`month`
&limit=`10`
&context=`web`
]]{'!TopLiked' | snippet : [
'class' => 'modResource',
'period' => 'month',
'limit' => 10,
'context' => 'web',
]}На странице «Популярное в разделе»:
<h2>Горячие материалы</h2>
[[!pdoResources?
&parents=`[[*id]]`
&depth=`2`
&leftJoin=`{"Aggregate":{"class":"Reactions\\Model\\ReactionAggregate","on":"Aggregate.object_id = modResource.id AND Aggregate.object_class = 'modResource'"}}`
&sortby=`Aggregate.trending_score`
&sortdir=`DESC`
&limit=`6`
&tpl=`tpl.collection.trending`
]]<h2>Горячие материалы</h2>
{'!pdoResources' | snippet : [
'parents' => $_modx->resource.id,
'depth' => 2,
'leftJoin' => '{"Aggregate":{"class":"Reactions\\Model\\ReactionAggregate","on":"Aggregate.object_id = modResource.id AND Aggregate.object_class = \'modResource\'"}}',
'sortby' => 'Aggregate.trending_score',
'sortdir' => 'DESC',
'limit' => 6,
'tpl' => 'tpl.collection.trending',
]}Добавьте ReactionsSchema в шаблон ресурса коллекции.
[[!ReactionsSchema]]{'!ReactionsSchema' | snippet}Подробнее — в seo.md.