Сортировка по количеству комментриев в 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)
Не писать ответ