Сортировка по количеству комментриев в MODx — непростая задача. Если у вас есть более изящный способ ее решить буду рад его услышать, т.к. наверняка он существует. Я же закрыл вопрос практически костылем.
Обший смысл такой: создать TV-параметр, копировать туда кол-во коммментариев, а при выводе через getResources
фильтровать используя sortbyTV
. Лично я столкнулся с проблемой копирования результата работы сниппета [[!QuipCount? &thread=`[[*alias]]-[[*id]]`]]
в TV-параметр. Поэтому Пришлось написать тяжеловесный плагин.
Итак, для начала создать TV-поле, назвать commentNumber
(тип число).
Код плагина commentCountUpdaterPlugin
:
Во вкладке Системиные события выбираем OnManagerLogin
(сработает при заходе в админку). Также обратите внимание на array('template' => 2)
. Это фильтр по шаблонам. Это можно удалить, или указать иной пареметр фильтрации.
$result = $modx->query("SELECT thread FROM modx_quip_comments WHERE approved = 1 AND deleted = 0"); if (is_object($result)){ $unic_ids = array(); while ($r = $result->fetch(PDO::FETCH_ASSOC)) { $id = substr($r['thread'], strrpos($r['thread'], "-")+1); if(empty($unic_ids[$id])){ $unic_ids[$id] = 1; }else{ $unic_ids[$id]++; } } $AllResources = $modx->getCollection('modResource', array('template' => 2)); foreach ($AllResources as $res) { $resid = $res->get('id'); if(empty($unic_ids[$resid])){ $res->setTVValue('commentNumber', 0); }else{ $res->setTVValue('commentNumber', $unic_ids[$resid]); } } }
Данное решение изрядно напрягает систему, т.к. проходится почти по ВСЕМ ресурсам в системе. Когда их 1500 это занимает 3-4 секунды. Напомню, что плагин срабатывает при входе в админку.
Вывод ресурсов
Теперь выводим ресурсы, сортируя по TV-параметру:
(Не забудте указать свои параметры для
parents
,
tpl
,
limit
,
depth
):
[[!getResources? &parents=`19` &tpl=`side-list-tpl` &sortbyTV=`commentNumber` &sortbyTVType=`integer` &sortdirTV=`DESC` &limit=`7` &depth=`0` ]]
Кстати
Стоит отметить что просто вывести кол-во отзывов — задача простая. Для этого есть специальный сниппет:
[[!QuipCount? &thread=`[[*alias]]-[[*id]]`]]
Как правильно указать пареметр &thread? Он должно быть тем же, что и указано в снипете. По-прежнему не понятно? Ок.
Находим у себя в шаблоне место, где выводится сниппет Quip
[[!Quip? &thread=`[[*alias]]-[[*id]]` &useGravatar=`0` &dateFormat=`%d %b %Yг. в %H:%M` &tplComment=`tplComment` ]]
Заметки и ссылки по теме:
Комментарии (0)
Не писать ответ