pdoPage не разбивает по страницам

pdoPage не разбивает по страницам и не сортирует результаты.
Вызываю так:
[[!pdoPage?
    &element=`youtubeTest`
    &sort=`[{"sortby":"myPlaceholder","sortdir":"ASC"}]`
    &limit=`2`
    &tpl=`stream`
]]
Элементы выводятся все сразу и не сортируются.
Что я делаю не так?
Андрей
05 сентября 2020, 03:41
modx.pro
145
0

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

Евгений Webinmd
05 сентября 2020, 07:11
+1
возможно проблема в параметре sort
попробуйте так:

&sort=`{"sortby":"myPlaceholder","sortdir":"ASC"}`

или так:
&sortby=`myPlaceholder`
&sortdir=`ASC`
    Андрей
    05 сентября 2020, 15:17
    0
    Вариант работает, только проблема не в нем была.
    Павел Романов
    05 сентября 2020, 11:16
    +1
    А как в сниппете youtubeTest (результат работы которого Вы пытаетесь разбить на страницы) обрабатываются переменные sort и limit, которые Вы ему передаете?
    pdoPage — это просто обертка. Сниппет, для вызова которого он используется, должен сам лимитировать вывод на основе входных параметров и иметь возможность сдвига (offset) для реализации пагинации.
      Андрей
      05 сентября 2020, 15:16
      0
      Спасибо, Павел! Навел на решение.
      Я почему-то думал, что это делает pdoPage.
        Андрей
        05 сентября 2020, 19:41
        0
        Павел, с сортировкой я разобрался, а постраничный вывод не работает (
        limit и offset работают так:
        foreach (new LimitIterator($array_index, $offset, $limit) as $idx => $res) {
            $output .= $modx->getChunk($tpl);
        }
          Андрей
          05 сентября 2020, 19:57
          0
          И еще…
          Никак не получается вынести порядок сортировки в переменную:
          $sortdirvalue = 'SORT_ASC'
          array_multisort($sort_array, $sortdirvalue, $arry_all);
            Павел Романов
            06 сентября 2020, 14:01
            +1
            У Вас в сниппете youtubeTest что именно перебирается? Если это объект, о котором MODX знает, то используйте просто getCollection. Там можно сразу все задать:
            //...
            $items= $modx->getCollection('Ваш_объект', array(
                'limit'=>$limit, 
                'offset' => $offset, 
                'sortby'=> $sortby,
                'sortdir'=> $sortdir,
            ));
            foreach($items as $item){
                $output .= $modx->getChunk($tpl, array());
            }
            //....
              Андрей
              06 сентября 2020, 14:10
              0
              Перебирается json массив.
                Павел Романов
                06 сентября 2020, 16:48
                +1
                Ну вот как пример:
                <?php
                $array = array(
                    'item1' => array('name' => 'Борис', 'lastname' => 'Гришин', 'age' => 1980),
                    'item2' => array('name' => 'Василий', 'lastname' => 'Васильев', 'age' => 1982),
                    'item3' => array('name' => 'Геогрий', 'lastname' => 'Демидов', 'age' => 1981),
                    'item4' => array('name' => 'Дмитрий', 'lastname' => 'Александров', 'age' => 1983),
                    'item5' => array('name' => 'Алексей', 'lastname' => 'Белов', 'age' => 1984),
                );
                
                $totalVar=$modx->getOption('totalVar', $scriptProperties, 'total');
                $modx->setPlaceholder($totalVar, count($array));
                $limit = $modx->getOption('limit', $scriptProperties, 10);
                $offset = $modx->getOption('offset', $scriptProperties, 0);
                
                function sorter($key) {
                    return function ($a, $b) use ($key) {
                        return strnatcmp($a[$key], $b[$key]);
                    };
                }
                
                usort($array, sorter($sortby)); // сортировка
                $sortdir == 'DESC' ? krsort($array) :  ksort($array); // направление
                $array = array_slice($array, $offset, $limit); //обрезаем, сдвигаем
                foreach($array as $item){
                    $out .= $item['name'].' '.$item['lastname'].' '.$item['age'].'<br />'; // выводим
                }
                return $out;
                Вызов:
                [[!pdoPage?
                &element=`SnippetName`
                &sortby=`lastname`
                &sortdir=`ASC`
                &limit=`3`
                ]]
                [[!+page.nav]]
                  Андрей
                  06 сентября 2020, 17:29
                  0
                  Дружище, спасибо! Я бы тебе 500 плюсов поставил за отзывчивость.
                  Пример подробнейший, все вроде делал правильно, просто другими способами.
                  Взял из твоего примера:
                  <?php
                  $array = array_slice($array, $offset, $limit); //обрезаем, сдвигаем
                  и все заработало.

                  Сортировку, из-за многомерного массива, приходится делать так:
                  <?php
                  foreach ($arry_all as $idx => $res) {
                      $sort_array[] .= $res->snippet->$sortby;
                  }
                  array_multisort($sort_array, SORT_DESC, $arry_all);
                  и никак не работает
                  array_multisort
                  если выношу
                  SORT_DESC
                  в переменную.
                    Павел Романов
                    06 сентября 2020, 18:13
                    +1
                    А так?
                    $sortdir == 'ASC' ? $order = SORT_ASC : $order = SORT_DESC;
                    array_multisort($sort_array, $order, $arry_all);
                      Андрей
                      06 сентября 2020, 18:31
                      0
                      Работает!
                      Сам не допер, извини уж, за такое количество вопросов. Да и в примере ты направление сортировки показал как надо.
                      Ты меня прокачал теперь я — мастер сниппетов!
          Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
          12