pdoPage + Easycomm: вывод комментариев на 1 странице с разбивкой кнопкой показать еще

Здравствуйте, друзья!
Столкнулась с задачей вывести комментарии Easycomm на одной странице. Необходимо собрать все комментарии которые находятся под ресурсом с id 5. Комментарии оставлены к дочерним ресурсам ресурса 5. То есть, комментарии оставлены не к ресурсу с id 5, а к дочерним ресурсам родителя с id 5. Мне необх+одимо эти комментарии вывести в новом ресурсе так чтобы на странице отображались по 10 комментариев и была кнопка Показать еще. Поэтому подумала можете pdoPage сможет это сделать.
Вот какой запрос написать с pdoPage, пока не знаю. Не нашла примеры.
Кстати, в комментариях, мне необходимо также вывести pagetitle и дополнительные поля ресурсов (не комментариев). Например, tv.logo, tv.lic.

Может вы сталкивались с подобной задачей? Пожалуйста, поделитесь опытом! Спасибо!
Zulya
18 октября 2022, 07:18
modx.pro
3
552
0

Комментарии: 12

Наумов Алексей
18 октября 2022, 09:09
1
+1
привет!
Да, здесь pdoPage должен работать.
{'!pdoPage' | snippet : [
    'element' => 'ecMessages',
...
все прочие параметры ecMessages
....
]}
Про работу кнопки «Загрузить еще» стоит читать его документацию…

Насчет этого «Необходимо собрать все комментарии которые находятся под ресурсом с id 5.»
Два варианта решения:
1. дочерних ресурсов мало — просто формируйте сторонним сниппетом строку для параметра threads для ecMessages в виде 'resource-6,resource-7,resource-8,resource-9,resource-10'…
2. Дочерних много — укажите threads='*', а ограничение выборки делайте через параметр where.
3. Дочерних много и они вложены на много уровней вниз — тут посложнее, все зависит от конкретной ситуации.
Я бы наверное изначально формировал thread в виде category-5-resource-10, чтобы потом через LIKE выбирать: 'category-5-%'.

>> также вывести pagetitle
Читайте про параметр resourceFields у сниппета ecMessages в документации.
А вот TV вы так не выберете. Тут только JOIN если делать.
    Zulya
    18 октября 2022, 10:04
    0
    Добрый день, Алексей!
    Спасибо вам за подробный ответ!
    Попробовала 2 вариант с параметром where. Ресурсы с комментариями которые необходимо вывести имеют шаблон 69. Поэтому я указала 69 в where.
    <div id="pdopage">
                    <div class="rows">
                        [[!pdoPage?
                            &element=`ecMessages`
                            &limit=`10`
                            &includeTVs=`logo,lic`
                            &processTVs=`1`
                            &tpl=`tpl.ecMessages.Row.Review`
                            &threads=`*`
                            &where=`{ "template:IN" : [ 69 ] }`
                            &ajaxMode=`button`
                        ]]
                    </div>
                    [[!+page.nav]]
                </div>
    Но что-то ничего не показывает. Если убираю параметр where, то выводятся все комментарии со всего сайта. А необходимо выводить комментарии ресурсов у которых шаблон равен 69. Может я неправильно указала параметр where?

    Еще вопрос. Как использовать JOIN для выборки TV? Можно пример без fenom? Спасибо большое!
      Наумов Алексей
      18 октября 2022, 10:24
      1
      +1
      template — это поле ресурса, нужно это указать.

      Я сейчас не вспомню точно как, но что-то типа resource.template или modResource.template.
      насчет join — поищите примеры здесь на форуме…
      ну типа modx.pro/help/13888
    Павел Романов
    18 октября 2022, 12:45
    1
    +1
    Попробуйте сделать сниппет getMessagesIds:
    $ids = $modx->getChildIds(5,10,array('context' => 'web'));
    $mess = array();
    $table_mess = $modx->getOption('table_prefix').'ec_messages';
    foreach ($ids as $id) {
        $sql = "SELECT * FROM {$table_mess} WHERE `thread` = {$id}";
        $q = $modx->prepare($sql);
        $q->execute();
        $messages = $q->fetchAll(PDO::FETCH_ASSOC);
        foreach ($messages as $message) {
           	$mess[] = $message['id'];
        }
    }
    return implode(',', $mess);

    И используйте его в качестве &messages в вызове:
    [[!pdoPage?
        &element=`ecMessages`
        &threads=`*`
        &messages=`[[!getMessagesIds]]`
        ......
    ]]

    Что касается полей ресурса, то в чанке сообщения можно использовать FastField:
    [[#[[+thread]].pagetitle]]
    [[#[[+thread]].logo]]
      Zulya
      18 октября 2022, 13:59
      1
      0
      Здравствуйте, Павел!
      Спасибо большое за готовое решение!
      Вы можете уточнить 10 в
      $ids = $modx->getChildIds(5,10,array('context' => 'web'));

      За что отвечает цифра 10?
      5 — если правильно поняла, это родитель (дедушка) в котором есть ресурсы, которые имеют комментарии.
      Zulya
      18 октября 2022, 14:06
      0
      Кстати, сейчас
      [[#[[+thread]].pagetitle]]
      [[#[[+thread]].logo]]
      В комментариях эти плейсхолдеры выводят значения с других ресурсов, а не значения ресурсов которым написаны комментарии.
      Например, если комментарий был написал к ресурсу Демо 1, то при выводе комментарий ресурса Демо 1, [[#[[+thread]].pagetitle]] и [[#[[+thread]].logo]] выводят значения с Демо Х.
        Павел Романов
        18 октября 2022, 14:11
        +1
        В &tpl указан чанк или @INLINE...?
        Что выводит просто [[+thread]].
          Zulya
          18 октября 2022, 14:17
          0
          В &tpl указан чанк.
          В ресурсе Демо 1, плейсхолдер [[+thread]] выводит ID ресурса Демо Х.
          Наверно поэтому в комментариях ресурса Демо 1 выводятся значения с Демо Х.
        Zulya
        18 октября 2022, 15:20
        0
        Еще обнаружила, что запрос выводит только 13 комментариев, хотя для теста я указала 100 в параметре limit. И выводятся комментарии не только с родителя дедушки с ID 5, а со всего сайта.
          Павел Романов
          18 октября 2022, 16:08
          1
          +1
          Да, пардон, там же темы в отдельной таблице и они с сообщениями линкуются по ID.
          Вот так должно сработать:
          <?php
          $mess = array();
          $thrs = array();
          $table_mess = $modx->getOption('table_prefix').'ec_messages';
          $table_threads = $modx->getOption('table_prefix').'ec_threads';
          
          $sql = "SELECT * FROM {$table_threads}";
          $q = $modx->prepare($sql);
          $q->execute();
          $threads = $q->fetchAll(PDO::FETCH_ASSOC);
          foreach($threads as $thread){
              $thrs[$thread['resource']] = $thread['id'];
          }
          
          $ids = $modx->getChildIds(5,10,array('context' => 'web'));
          foreach ($ids as $id){
              $tid = $thrs[$id];
              $sql = "SELECT * FROM {$table_mess} WHERE `thread` = {$tid}";
              $q = $modx->prepare($sql);
              $q->execute();
              $messages = $q->fetchAll(PDO::FETCH_ASSOC);
              foreach ($messages as $message) {
                 	$mess[] = $message['id'];
              }
          }
          return implode(',', $mess);

          В чанках вот так попробуйте:
          [[#[[+thread_resource]].pagetitle]]
          [[#[[+thread_resource]].logo]]
            Zulya
            18 октября 2022, 18:24
            0
            Павел, огромное вам спасибо! Это решение действительно решило мою задачу!
        Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
        12