Отсортировать ресурсы по количеству комментариев Quip MODX

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

  1. Напишите первый комментарий
*Комментарий будет опубликован после проверки модератором

Похожие статьи

Наш сайт использует куки, нажмите «ОК» если вы не против
OK