Отсортировать ресурсы по количеству комментариев 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. Напишите первый комментарий
*Комментарий будет опубликован после проверки модератором

[MODx] Генератор настроек MIGX

[MODx, MIGx] Документация на русском по MIGX

[MODX] Импорт и экспорт в MiniShop2. Реализация 1

[MODx] minishop2 tips

[JS] Маска для ввода телефона +7(___)___-__-__

[MODx, miniShop2] Генерация YML для выгрузки в маркет

Как включить HTTPS (SSL) в MODX - Подробная инструкция

[MODx] Подсказки по API

[OpenCart] Вывести на главную все категории с картинками

[MODx, MIGX] Примеры использования

[MODx] Сайт на обслуживании (выключить сайт)

Универсальная форма обратной связи — feedBackForm

[PHP, JSON] Пример перевода с помощью Yandex Translate API

[MODx, Gallery] Галерея. Вывести обложки альбомов и фотографии

Расширение свойств товаров minishop2

[Opencart] Вернуть английский язык, если вы его удалили

[OpenCart] Вывести модуль напрямую через контроллер

[MODx, Quip] Более рабочий вариант.

[MODX, MIGX] Вывести getImageList только если он не пустой

[MODX, MIGX] Тип поля "Список ресурсов" (resourcelist) с ограничением по родителю (parents)

Красивое адаптивное меню под pdoMenu

[MODx] Создать источник файлов

[MODx] Вывод tv-параметров в формате [название TV] - [значение TV]

[PHP] Простое логирование

[MODX] Вывести список всех опций MiniShop2

Все записи