Подскажите, как вывести свой сниппет через pdoPage

Все здравствуйте!
Уважаемые знатоки, подскажите, как правильно вывести результаты своего сниппета через пагинацию pdoPage?
Мой сниппет собирает комментарии к страницам товаров и выводит все в одном месте (нужна особая выборка, по этому решился на свой скрипт).
Код:

<?php
// проверяем входные в сниппет параметры
if (empty($lmt)) {$lmt = '1000';}
if (empty($chunk)) {$chunk= 'tpl.Review';}

// установил фиксированное значение на время разработки
// попытка прикрутить pdoPage
$total = 800;
$totalVar=$modx->getOption('totalVar', $scriptProperties, 'total');
$modx->setPlaceholder($totalVar,$total);
$limit=$modx->getOption('limit', $scriptProperties, 10);
$offset=$modx->getOption('offset', $scriptProperties, 0);


// готовим запрос к базе данных
$query=$modx->newQuery('TicketComment');
$query->select(array(
    '`TicketComment`.`id`, `TicketComment`.`text`, `TicketComment`.`name`, `TicketComment`.`createdon`, `TicketComment`.`properties`, `Therd` . `resource`'
    ));
$query->leftJoin('modUser','User','User.id = TicketComment.createdby');
$query->leftJoin('modUserProfile','Profile', 'Profile.internalkey = TicketComment.createdby');
$query->leftJoin('TicketThread','Therd', 'Therd.id = TicketComment.thread');
$query->where(array('TicketComment.deleted' => 0, 'TicketComment.parent' => 0));
$query->groupby('TicketComment.id');
$query->sortby('TicketComment.createdon','DESC');
$query->limit($limit, $offset);
$query->prepare();
//echo $query->toSQL();
if ($query->prepare() && $query->stmt->execute()) {
    // Зачитываем в ассоциативный массив
    $reviews = $query->stmt->fetchAll(PDO::FETCH_ASSOC);
}

// переменная для вывода резальтатов сниппета
$output = '';

// перебираем результат и собираем вывод
foreach ($reviews as $review) {
    $reviewID = $review['id'];
    $reviewText =  $review['text'];
    $properties =  $modx->fromJSON($review['properties']);
    $reviewImg =   $properties['image'];
    $reviewImgOrg =   $properties['image_orig'];
    $reviewUserName =   $review['name'];
    $reviewCreatedAt =    $review['createdon'];
    $reviewResourceURI = $modx->makeUrl($review['resource'], 'web', '', 'full');
    $reviewURI = $reviewResourceURI . '#comment-' . $review['id'];
    
    
   $output .= $modx->getChunk($chunk, array(
        'id' => $reviewID,
        'text' => $reviewText,
        'img' => $reviewImg,
        'img_orign' => $reviewImgOrg,
        'username' => $reviewUserName,
        'createdat' => $reviewCreatedAt,
        'parent' => $reviewResourceURI,
        'url' => $reviewURI,
    
    ));
}
return $output;
В итоге, получаю только первую страницу без пагинации…

Благодарен буду любой подсказке.
Павел Мезенцев
18 июня 2018, 18:22
modx.pro
3
3 583
0

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

Илья Уткин
19 июня 2018, 07:19
+1
Всё в сниппете верно, пагинация должна работать. Как вызываете?
[[!pdoPage? &element=`mySnippet`]]
[[!+page.nav]]
    Павел Мезенцев
    19 июня 2018, 18:26
    0
    Вызываю так:
    [[!pdoPage?
        &element=`mySnippet`
        &chunk=`tpl.Review`
        &limit=`2`
    [[!+page.nav]]
      Павел Мезенцев
      21 июня 2018, 20:50
      0
      Идиотия…
      я просто забыл закрывающие скобки для сниппета (((((((

      Спасибо, что откликнулись =), а так может хоть скрипт кому пригодиться.
      На всякий случай, правильный вызов:
      [[!pdoPage?
          &element=`mySnippet`
          &chunk=`tpl.Review`
          &limit=`2`
      ]]
      [[!+page.nav]]
    Михаил
    19 июня 2018, 08:33
    1
    0
    Меня не много это смутило:
    $query->leftJoin('TicketThread','Therd', 'Therd.id = TicketComment.thread');
      Илья Уткин
      19 июня 2018, 13:11
      0
      Опечатка, но на функциональность она не повлияет — ведь это просто алиас, можно даже так написать:

      $query->leftJoin('TicketThread','Vetka', 'Vetka.id = TicketComment.thread');
    Павел Мезенцев
    20 июня 2018, 20:38
    0
    нет идей ни у кого?
      wissem
      28 февраля 2023, 00:17
      0
      Друзья, прошу помощи с выводом свего сниппета через pdoPage и пагинации к нему. У меня есть форма поиска в базе (сторонней) которая отправляет запрос через Ajax. Как быть в этом случае? Т.е. запрос с формы идет на страницу со сниппетом, который возвращяет результаты поиска в сторонней БД, после чего эти данные вставляются в div на странице с формой. Как в ткаом случае выводить результаты с пагинацией? Я совершенно запутался
        Артур Шевченко
        28 февраля 2023, 20:40
        0
        Чтобы выводить данные с разбивкой по страницам, нужно в ajax запросе отправлять limit и offset и вставлять эти данные в SQL запрос к БД в которой идёт поиск. Соответственно limit и offset зависят о номера страницы.
          wissem
          28 февраля 2023, 23:45
          0
          а как этот блок пагинации [[!+page.nav]] знает что либо об ответе сниппета на аякс запрос? Вы бы могли какой-то простой пример привести?
              wissem
              01 марта 2023, 00:55
              0
              Статья действительно толковая, но там ни слова про аякс. В моем случае не особо помогла. Попробую расписать подробнее.
              У меня есть страница, на которой есть форма, которая отсылает чререз аякс запрос и блок с результатами запроса, куда они вставляются после успешного его выполнения. Первоначально выглядит к примеру так:
              [[$searchForm]]
              <div id="search-results" class="col-lg-8">
              [[!+page.nav]]
              [[!pdoPage? &element=`display_something` &limit=`2` &chunk=`itemRowTpl`]]
              </div>
              в сниппете «display something», если в $_REQUEST ничего нет, то возвращаются все записи. И все сделано впринципе как в статье, т.е. прописаны $total, $totalVar, $limit и $offset. И пагинация в этом случае выводится (т.е. когда выводятся все данные), типа сниппет отработал, без запроса с формы и все ок. НО после ввода данных с формы, отправки их через аякс и получении ответа с этого сниппета, где был выполнен другой запрос на основании данных из формы, мы все так же видим пагинацию первоначальную, со ссылками вида
              <a href="mysite/thispage?page_1">1</a>
              <a href="mysite/thispage?page_2">2</a>
              и тд. И выходит что результат запроса аяксом вставлен в блок id=«search-results», но пагинация то осталась старая. Как сделать, чтоб пагинация работала именно для текущих результатов полученных с помощью аякса?
              Старался понятно расписать) заранее спасибо за ответы!)
                Артур Шевченко
                01 марта 2023, 11:33
                0
                мы все так же видим пагинацию первоначальную
                Первое, что приходит на ум, это заменить блок, так же как и результаты, т.е. при запросе на сервер вызвать pdoPage.
                  wissem
                  01 марта 2023, 13:38
                  0
                  Т.е. вы имеете ввиду вызвать pdoPage на сервере верно? типа получить в ответе кроме результатов еще и блок page.nav, но с сервера? но ведь это не сработает) потому что при переходе по страницам этого page.nav будет обращение к server_page.php?page_1 и тд но без даных ранее веденных в форме, соответственно ответ будет не тот опять таки)
                  Алексей Смирнов
                  01 марта 2023, 11:48
                  0
                  А что за аякс. вы сами этот аякс писали? он отделен от pdoPage?
                    wissem
                    01 марта 2023, 13:53
                    0
                    ну мне необходимо как-то из формы передать данные, что именно искать в базе, получить ответ и вставить его в блок с результатами . Соответственно беру данные и передаю ajaxoм и получаю ответ:
                    $("#search-form").submit(function (event) {
                            let formData = {
                                internal_id: $("#search-form-internal-id").val(),
                                iupac_name: $('#search-form-iupac-name').val(),
                                formula: $("#formula").val(),
                                cas: $("#cas").val(),
                                molweight_min: $("#mol-weight-min").val(),
                                molweight_max: $("#mol-weight-max").val()
                            };
                    
                            console.log(formData); //debug
                    
                            $.ajax({
                                type: "POST",
                                url: "./search-handler",
                                dataType: "json",
                                data: formData,
                                encode: true,
                                converters: {
                                    'text json': true
                                },
                                success: function(data) {
                                    // console.log(data); //debug
                                    $('#search-results').html(data);
                                }
                            }).done(function () {
                                console.log("request_done");
                            });
                    
                            event.preventDefault();
                        });
                      Алексей Смирнов
                      01 марта 2023, 13:59
                      +1
                      так это не работает. вы либо делаете свой сниппет и свою пагинацию
                      либо используете полностью pdoPage без своего ajax. Потому что pdoPage и знать не знает что у вас там в ajax. и как следствие не сможет перерисовать вам пагинацию.
                      Где-то была статья по поводу фильтров на PdoPage, но есть ощущение что или писать все самому или брать mSearch2, к нему можно прикрутить свою таблицу и там встроенные фильтры и все это на ajax работает.
                      СТатья:
                      ilyaut.ru/tips-and-tricks/simple-ajax-filter-using-pdopage/
        Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
        20