[pdoTools] Версия 1.8.0-rc: Сниппет pdoPage

Продолжаю разрабатывать версию 1.8.0, сегодня у нас в студии release candidate: JSON поля, автозагрузка классов и сниппет pdoPage.

JSON поля

Как известно, в таблицах MODX встречаются текстовые поля, в которых движок хранит JSON строки, представляющие массивы.

Например, это поле properties у ресурса и extended у профиля пользователя. pdoFetch выбирает такие поля «как есть» и если вы укажете в чанке [[+properties]], то увидите что-то типа:
{"key":"value"}
С новой версии эти поля автоматически разбираются, и getChunk выставляет плейсхолдеры [[+имяполя.ключмассива]]

То есть, указав [[+extended.key]] вы получите value. Это работает везде, и в pdoResources и в pdoUsers.
Идея честно стырена у YJ Tso, который написал аналог pdoUsers, сам того не подозревая.

Автозагрузка классов

В одной из прошлых версий pdoTools, я начал регистрировать классы компонента через modX::addExtensionPackage().
Это такая система, которая постоянно держит в памяти указанные классы, чтобы они могли использоваться в качестве CRC или еще где.

Так вот, все были довольны, пока до компонента не добрался Romain Tripault, который включил уровень ошибок MODX на максимум и увидел, что в логах пошла ругань на ошибку addPackage().

Оказалось, что для extension package xPDO ожидает наличие модели БД, которой в pdoTools нет. Беда, конечно, ведь быстрый вызов очень приятно использовать:
$pdo = $modx->getService('pdoFetch');
Пришлось выкручиваться:
1. Нашел в исходном коде modX::getService() проверку полного имени класса в modX::config.
2. Добавил 2 системных параметра pdoTools.class и pdoFetch.class и указал в них pdotools.pdotools и pdotools.pdofetch.
Это значит, что теперь при загрузке этих классов они будут искаться в /core/model/modx/pdotools/
3. Положил в эту директорию файлики-ссылки на классы в /core/components/pdotools/model/pdotools.

И теперь у нас и getService() работает, и ошибок нет, и классы не висят постоянно в памяти, а загружаются по первому требованию.

Нетерпеливые граждане словили ошибки в связи с этим изменением сегодня ночью, когда я забыл положить в пакет файлики-ссылки.
А вот нечего обновляться раньше официального объявления!


Новый сниппет pdoPage

Написал собственную версию пагинатора для MODX, которая рендерит чанки через pdoTools и обладает приятными особенностями. Документация здесь.

1. Компонент бесприкословно подчиняется параметру &pageLimit — cтраницы не скачут. Если указано выводить только 5 ссылок — их будет 5 или меньше.

Вот такой фигни вы не увидите:

Будет все правильно:

Боковые ссылки в &pageLimit не входят — это отдельные плейсхолдеры, которые вы можете убрать.

2. Если &pageLimit >= 7, то включается специальный режим отображения ссылок. Конечно, количество доступных страниц тоже должно быть >=7:

7 является минимально удобным числом для такой навигации: первая, последняя, текущая, предыдущая и следующие страницы + 2 пропуска по бокам — выходит 7.

Так сделано по умолчанию, но вы можете и отключить это поведение недокументированным параметром &disableModernPagination=`1` и тогда у вас будет классическая пагинация при &pageLimit > 7.

3. Автоматический редирект на первую страницу, если любопытный юзер ввел что-то не то в параметр page. Ну или если поисковик зашел по старой ссылке на страницу 156, а у вас кризис и товаров осталось только на 155 страниц.

4. Параметр &maxLimit, который запрещает юзеру вводить в url &limit=0 или &limit=10000 и радостно смотреть как сайт наглухо виснет при попытке вывести все возможные документы.

По умолчанию, параметр равен 100, но я советую равнять его с &limit, если вы не переключаете количество выводимых результатов на сайте с фроненда.

5. Возможность нормально указать, что показывать, если нет ссылок на первую, последнюю, следующую и предыдущую страницы.
Никаких фильтров выводов — только отдельные чанки.

6. Так как это pdoTools, в параметре &element сразу прописан pdoResources — то есть один параметр можно уже не указывать.

7. Работает параметр &offset. Чанки максимально упрощены, и заточены для Twitter Bootstrap.

Заключение

Обновляемся, тестируем, пишем отзывы. Сниппет pdoPage уже используется на этом сайте везде, где только можно — getPage и getPageExt удалены.

На очереди остался только сниппет pdoMenu — готовлюсь морально.

Следующая заметка
[pdoTools] Версия 1.8.3: Новый сниппет pdoMenu
Предыдущая заметка
[msDiscount] Система скидок для miniShop2


Комментарии ()

  1. Лисоченко Кирилл 15 октября 2013, 13:00 # 0
    Обновился, всё отлично работает.
    Только один вопрос: На первой странице кнопка (первая) и (<<) — естесственно неактивны, на второй неактивна только кнопка (первая), (<<) — активна, на третьей активны все, также с кнопкой (последняя) и (>>) на соотвествующих страницах. Это так задумано?
    1. Василий Наумкин 15 октября 2013, 13:02 # 0
      Да.
      Немного спорное решение, но иначе на второй странице аж три ссылки на первую — зачем?

      Если общественность не оценит — поменяю.
      1. Лисоченко Кирилл 15 октября 2013, 13:10 # 0
        Понятно. В остальном пока всё прекрасно.
    2. Виталий Киреев 15 октября 2013, 13:28 # 0
      Скоро на типовой сайт ничего, кроме pdoTools, не надо будет ставить :)
      1. Василий Наумкин 15 октября 2013, 13:30 # 0
        Именно так.

        При этом, типовой сайт еще и быстро бегать будет.
      2. Володя 15 октября 2013, 13:39 # 0
        Василий пока на твоем сайте мучаю новое творение. И вопрос один возник — если страница пагинации не существует,
        т.е. к примеру я забью в адресной строке — bezumkin.ru/?page=500
        то думает около — 1.30 сек. я конечно не уверен на сто % что с getpage было быстрее, но вот просто спросил)))
        и еще вывод двоит — при указании параметра limit
        1. Володя 15 октября 2013, 14:02 # 0
        2. Володя 15 октября 2013, 14:25 # 0
          и самая прикольная бага —
          1. Василий Наумкин 15 октября 2013, 14:59 # 0
            Удвоение починил, это из-за &toPlaceholder. -0 тоже починил, и +0 заодно — можно обновляться =)

            По поводу «долго думать» при несуществующей странице — это, наверное, нормально. Ведь сниппет полностью отрабатывает, получает total, считает сколько всего страниц и если маловато — редиректит.
            То есть, работа производится двойная.

            У getPage такого просто нет — он печально покажет пустую страницу.
            1. De Ribaskin 15 октября 2013, 15:09 # 0
              Василий, после этого обновления параметр page дублируется в ссылках.
              заходим на 2-й страницу — ?page=2.
              переходим со 2-й на 3-ю — ?page=3&page=2
              1. Василий Наумкин 15 октября 2013, 16:14 # 0
                Удали и заново поставь.
                1. De Ribaskin 15 октября 2013, 16:24 # 0
                  Сделал.
                  Теперь в ссылки добавляется путь:
                  /media/foto/?page=3&q=media%2Ffoto%2F
                  так и задумано?
                  1. Володя 15 октября 2013, 17:40 # 0
                    ну за это вот этот блок отвечает

                    если закомментить то не будет.
                    Но для чего нужно? это нужно Василия ждать.
                    P.S. для передачи параметров))) я уже понял
                    1. Василий Наумкин 15 октября 2013, 17:46 # 0
                      Да нормально там все.

                      Просто я кучу версий с разными косяками выкладывал в течении 5 минут — на какую то из них он обновился. Надо удалить компонент и закачать по новой из репо, а не переустанавливать имеющийся.

                      $_GET параметры, конечно, комментить не стоит.
                      1. De Ribaskin 15 октября 2013, 17:52 # 0
                        Удалил компонент, поставил заново — тоже самое :)
                        1. Василий Наумкин 15 октября 2013, 18:02 # 0
                          Ну а почему у меня не тоже самое?

                          Замени вручную содержимое файла, почисти кэш — должно работать.
                          1. De Ribaskin 15 октября 2013, 18:17 # 0
                            хз Василий почему у тебя не так.
                            Удалил пакет 1.8.0 rc2, поставил 1.8.0 rc3. вручную очистил core/cache — не помогает.
                            Обновил класс pdopage.class.php по твоей ссылке, вручную очистил core/cache — не помогает.
                            Вызываю так:
                            [[!+page.nav]]
                            [[!pdoPage@Медиа_Видео_pdomenu?]]
                            [[!+page.nav]]
                            Набор параметров:
                            [{"name":"depth","desc":"","xtype":"textfield","options":[],"value":"0","lexicon":"","overridden":0,"desc_trans":"","area":"","area_trans":"","menu":null},{"name":"includeTVs","desc":"","xtype":"textfield","options":[],"value":"media_video","lexicon":"","overridden":0,"desc_trans":"","area":"","area_trans":"","menu":null},{"name":"limit","desc":"Ограничение количества результатов выборки. Можно использовать \"0\".","xtype":"numberfield","options":[],"value":9,"lexicon":"pdotools:properties","overridden":0,"desc_trans":"Ограничение количества результатов выборки. Можно использовать \"0\".","area":"","area_trans":"","menu":null},{"name":"maxLimit","desc":"Максимально возможный лимит выборки. Перекрывает лимит, указанный пользователем через url.","xtype":"numberfield","options":[],"value":9,"lexicon":"pdotools:properties","overridden":0,"desc_trans":"Максимально возможный лимит выборки. Перекрывает лимит, указанный пользователем через url.","area":"","area_trans":"","menu":null},{"name":"pageLimit","desc":"Количество ссылок на страницы. Если больше или равно 7 - включается продвинутый режим отображения.","xtype":"numberfield","options":[],"value":7,"lexicon":"pdotools:properties","overridden":0,"desc_trans":"Количество ссылок на страницы. Если больше или равно 7 - включается продвинутый режим отображения.","area":"","area_trans":"","menu":null},{"name":"parents","desc":"","xtype":"textfield","options":[],"value":"20","lexicon":"","overridden":0,"desc_trans":"","area":"","area_trans":"","menu":null},{"name":"scheme","desc":"Схема формирования url, передаётся в modX::makeUrl().","xtype":"list","options":[{"value":-1,"text":"-1 (relative to site_url)","name":"-1 (relative to site_url)"},{"value":"full","text":"full (absolute, prepended with site_url)","name":"full (absolute, prepended with site_url)"},{"value":"abs","text":"abs (absolute, prepended with base_url)","name":"abs (absolute, prepended with base_url)"},{"value":"http","text":"http (absolute, forced to http scheme)","name":"http (absolute, forced to http scheme)"},{"value":"https","text":"https (absolute, forced to https scheme)","name":"https (absolute, forced to https scheme)"]},"value":"abs","lexicon":"pdotools:properties","overridden":0,"desc_trans":"Схема формирования url, передаётся в modX::makeUrl().","area":"","area_trans":"","menu":null},{"name":"tpl","desc":"","xtype":"textfield","options":[],"value":"Список_видеогалерей_tpl","lexicon":"","overridden":0,"desc_trans":"","area":"","area_trans":"","menu":null},{"name":"tplPageWrapper","desc":"Чанк оформления всего блока пагинации, содержит плейсхолдеры страниц.","xtype":"textfield","options":[],"value":"@INLINE <ul class=\"pagination pagination-sm\">[[+first]][[+prev]][[+pages]][[+next]][[+last]]</ul>","lexicon":"pdotools:properties","overridden":0,"desc_trans":"Чанк оформления всего блока пагинации, содержит плейсхолдеры страниц.","area":"","area_trans":"","menu":null},{"name":"tplWrapper","desc":"","xtype":"textfield","options":[],"value":"@INLINE <div class=\"gallery-list\">[[+output]]</div><div class=\"clear\"> </div>","lexicon":"","overridden":0,"desc_trans":"","area":"","area_trans":"","menu":null]}
                            1. Василий Наумкин 15 октября 2013, 18:42 # 0
                              Проверь на modx-test.com

                              Сейчас в коде генерации ссылки вообще нет $_REQUEST, а &q=media%2Ffoto%2F именно оттуда.

                              У тебя случаем никакой плагин ничего в $_GET не пишет по OnPageNotFound?
                            2. Володя 15 октября 2013, 18:47 # 0
                              удалил, закачал новый — не помогло.
                              заменил класс вручную — не помогло.
                              1. Василий Наумкин 15 октября 2013, 18:58 # 0
                                Ррррр!
                                Я уже ненавижу этот дурацкий сниппет!

                                Обновляйся, rc4 — работает.
                                1. Володя 15 октября 2013, 19:14 # 0
                                  Дя, дя… ))) теперь все четко!
                  2. Володя 15 октября 2013, 16:05 # 0
                    Василий а в поиске у тебя сейчас какой компонент на пагинации трудится?
                    потому как фишка с отрицательным нулем там тоже присутствует. Запросто можно сайт повесить...)
                    1. Василий Наумкин 15 октября 2013, 16:17 # 0
                      Там mFilter2 пропускал — уже поправил, спасибо.
                2. Любовь 15 октября 2013, 18:41 # 0
                  Результаты поиска хочу вывести с помощью pdoPage:
                  [[pdoPage? &element=`mSearch` &tpl=`tpl.mSearch.row` &limit=`2` &parents=`19,12,22,32` &pageLimit=`3`]]
                  
                  Ничего не выводит, а в логах ошибка:
                  [2013-10-15 18:25:31] (ERROR @ /index.php) Error on execution search query: SELECT `rid`,`resource`, MATCH(`resource`,`index`) AGAINST ('>"новость" <(НОВОСТЬ НОВОСТИ НОВОСТЬЮ НОВОСТЕЙ НОВОСТЯМ НОВОСТЯМИ НОВОСТЯХ )' IN BOOLEAN MODE) as `rel`
                  			FROM `modx_mse_modResIndex`
                  			LEFT JOIN `modx_site_content` `modResource` ON `modx_mse_modResIndex`.`rid` = `modResource`.`id`
                  			WHERE (MATCH (`resource`,`index`) AGAINST ('>"новость" <(НОВОСТЬ НОВОСТИ НОВОСТЬЮ НОВОСТЕЙ НОВОСТЯМ НОВОСТЯМИ НОВОСТЯХ )' IN BOOLEAN MODE) OR `resource` LIKE '%новость%')
                  			AND (`modResource`.`searchable` = 1  AND `hidemenu` != 1 AND `published` != 0) 
                  			ORDER BY `rel` DESC LIMIT ,2
                  Я неправильно использую сниппет?
                  1. Василий Наумкин 15 октября 2013, 18:43 # 0
                    Не знаю, я забросил mSearch1.
                    1. Денис Богдановский 08 ноября 2013, 14:12 # 0
                      Та же проблема. Ради этого придется опять ставить getPage и ждать необходимости что либо фильтровать через mSearch2 :)
                  2. Володя 15 октября 2013, 19:36 # 0
                    Василий я тебя решил сегодня доканать вопросами)))
                    параметр в командной строке если и не существует, то при запросе все равно там остается.
                    то есть я могу туда писать все что угодно, к примеру

                    потом загоню эту ссылку в индекс и она ведь проиндексируется?
                    P.S. отвечать не обязательно, я знаю как ты ко всяким штукам сеошным относишся)))
                    1. Василий Наумкин 15 октября 2013, 19:39 # 0
                      Ну а куда оно должно пропадать?

                      У тебя на странице может быть 50 сниппетов и кому-то из них позарез нужен именно этот параметр. Возможно, limit стоит очищать, но все остальное трогать никак нельзя.

                      Опять же, сравни как работает getPage — тоже самое.
                      1. Володя 15 октября 2013, 20:03 # 0
                        ну что теперь на getPage равняться ?)))
                        1. Василий Наумкин 15 октября 2013, 20:12 # 0
                          Найди способ безошибочно оставлять в url только нужные параметры — и будем равняться на что скажешь.
                          1. De Ribaskin 15 октября 2013, 21:29 # 0
                            способ есть — создать параметр сниппета, в котором перечислять все параметры строки которые должны браться из GET. По умолчанию — брать все, если параметр не пустой — брать только параметры pdoPage и те что перечислены.

                            Кому это будет необходимо — будет этим пользоваться.
                            1. Василий Наумкин 15 октября 2013, 21:34 # 0
                              Это ты всем возможным сниппетам на странице и в шаблонах создашь такой параметр?

                              Уже представляю работу с карзиной на странице каталога с пагинацией, когда из запроса будут удаляться ненужные ей параметры =)
                              1. De Ribaskin 15 октября 2013, 21:59 # 0
                                Не, я не создаю, мне лень. Я так… гипотетически :)
                        2. Володя 15 октября 2013, 21:59 # 0
                          Да я чет подумал, фигню я пожалуй сморозил…
                          сейчас быстренько по сайтам поскакал, всюду так работает… Полный контроль принципе возможен я думаю, но опять же зачем если все обходятся.
                        3. Алексей Карташов 15 октября 2013, 23:31 # 0
                          Если боишься за дубли в серпе, то открой для себя rel=«canonical» =)
                        4. Ivan Shvindin 16 октября 2013, 13:20 # 0
                          после обновления пдо, Tickets ругаются
                          Warning: json_decode() expects parameter 1 to be string, array given in /home/i/user/public_html/core/xpdo/xpdo.class.php on line 2359
                          1. Василий Наумкин 16 октября 2013, 13:22 # 0
                            Tickets тоже нужно обновить.
                            1. Ivan Shvindin 16 октября 2013, 14:15 # 0
                              Tickets стоял из офф репозитория, прошу прощения, теперь всё ок :)
                          2. Сергей Шлоков 17 октября 2013, 12:21 # 0
                            После обновления теперь не грузятся свои классы (loadModel). Выдает такую ошибку:
                            [2013-10-17 11:27:55] (ERROR @ /index.php) [pdoTools] Could not load collection of "Customers": Error 42S22: Unknown column 'modResource.firm' in 'where clause'
                            Т.е. алиас ставится modResource, хотя таблица modx_customers
                            $pdo = $modx->getService('pdoFetch');
                            $rows = $pdo->getCollection('Customers', array('firm'=>$firm), array('loadModels' => 'customers','sortby'=>'name','sortdir'=>'ASC'));
                            1. Василий Наумкин 17 октября 2013, 12:30 # 0
                              Замени в методе pdoFetch::getCollection()
                              $this->config['class'] = $class;
                              на
                              $сonfig['class'] = $class;

                              В следующей версии будет исправлено.
                              1. Сергей Шлоков 17 октября 2013, 12:42 # 0
                                У меня в 3-ей строке метода pdoFetch::getCollection() уже так и написано:
                                $сonfig['class'] = $class;
                                1. Василий Наумкин 17 октября 2013, 12:54 # 0
                                  Тогда у тебя не последняя версия.

                                  Обновляйся и сразу меняй эту строку.
                                  1. Сергей Шлоков 17 октября 2013, 12:56 # 0
                                    Обновился час назад. Версия 1.8.0-rc5.
                                    Щас удалю и заново накачу.
                                    1. Сергей Шлоков 17 октября 2013, 13:04 # 0
                                      Не могу его полностью удалить: сбросило до версии 1.7.0-rc2. При дальнейшей попытке деинсталировать ищет пакет с pdotools-1.7.2-pl1 и виснет. А как ручками удалить?
                                      1. Сергей Шлоков 17 октября 2013, 13:18 # 0
                                        Обновил. Теперь ошибок нет.
                                        Василий, вопросик по phpStorm. Как работает «синхронизация»? Я обновил pdotool и нажал «синхронизировать», чтобы на локалке обновились файлы. Но видимо файлы на локалке остались старые. Т.е. в phpStorm «синхронизация» работает как-то по другому?
                                        Получается, при обновлении MODX надо будет на локалку качать всё.
                                        1. Василий Наумкин 17 октября 2013, 13:22 # 0
                                          Такие вопросы лучше задавать отдельно, чтобы не путаться.

                                          Я не знаю, как у тебя устроено, но отдельный пункт «синхронизация» — это между внутренним кэшом phpStorm и файлом на жестком диске.

                                          А для синхронизации с хостингом, или локальным сайтом есть отдельный раздел Deployment и там пункты «upload», «download» и «sync with...». Deployment нужно настроить, предварительно.
                                          1. Сергей Шлоков 17 октября 2013, 13:27 # 0
                                            Понял. Спасибо. Не обратил внимание на «sync with...» То что нужно.
                                2. Peter Zenin 19 октября 2013, 19:17 # 0
                                  Что-то странное происходит, не устанавливается почему-то:
                                  1. Василий Наумкин 19 октября 2013, 19:18 # 0
                                    Думаешь, это я тебе прислал Server Internal Error?
                                    1. Василий Наумкин 19 октября 2013, 19:22 # 0
                                      Ага, я прислал =)

                                      Оказывается, при чистой установке есть баг, сейчас будет обновление, спасибо за тревогу!
                                      1. Peter Zenin 19 октября 2013, 19:25 # 0
                                        Спасибо! Все установил! :-))))))))
                                        1. Василий Наумкин 19 октября 2013, 19:30 # 0
                                          Ура!

                                          Еще раз благодарю за бдительность, я тут совсем уже плохо соображаю.
                                    2. Yani 21 ноября 2013, 01:43 # 0
                                      Доброй ночи, сайт на 2х контекстах. в web картинки показываются, в en выводится только значение ТВ без обработки его пути (например вместо /assets/images/img.img в контексте en выводится img.img)
                                      возов делаю так

                                      [[!pdoPage?
                                      &parents=`[[++contextKey:is=`web`:then=`32`:else=`43`]]`
                                      &tpl=`indexItem`
                                      &limit=`2`
                                      &includeTVs=`img,gallery,rating,square,exibition`
                                      &tvPrefix=``
                                      &proccesTVs=`img`
                                      &prepareTVs=`img`
                                      &sortby=`{"rating": "asc", "publishedon": "asc"}`
                                      &toPlaceholder=`results`
                                      ]]
                                      в шаблоне
                                      <img src="[[+img:phpthumbof=`w=190&zc=`&h=127`]]" alt="[[+pagetitle]]" height="127" width="190" />
                                      1. Александр Москвин 21 ноября 2013, 03:05 # 0
                                        Скорее всего неправильно контекст настроил, ты указывал base_url?
                                        Вот смотри сайт 2 версии, пусть вторая не переведенная, но всё пашет, использовал pdoPage
                                        activesale.net/
                                        1. Yani 21 ноября 2013, 11:12 # 0
                                          да, указывала prntscr.com/25ndcd
                                          1. Yani 21 ноября 2013, 11:52 # 0
                                            Если делаю с теми же параметрами вызов pdoResources то картинка появлется,
                                            а на pdoPAge — картинки нет. мне кажется где то в коде баг
                                            1. Василий Наумкин 21 ноября 2013, 12:13 # 0
                                              Ну конечно, где же еще может быть баг?

                                              pdoPage сам не делает ничего, он только вызывает другой сниппет и выводит результаты его работы, с разбивкой по страницам. Как он может поломать вывод картинок в одном контексте — я не понимаю.

                                              Давай данные для доступа на bezumkin@ya.ru — посмотрю.
                                              1. Yani 21 ноября 2013, 13:16 # 0
                                                Отправлено.
                                                а может и в моих кривых руках дело)
                                                1. Василий Наумкин 21 ноября 2013, 13:23 # 0
                                                  А где проблема то? Вывыел путь картинки — в обоих контекстах всё одинаково:
                                                  1. Yani 21 ноября 2013, 13:32 # 0
                                                    но оно не работало. выводился не полный путь. кэш чистился.
                                                    Василий, это «эффект присутствия» более квалифицированного специалиста. спасибо)
                                                    1. Василий Наумкин 21 ноября 2013, 13:36 # 0
                                                      Скорее, у тебя где-то закэшировались настройки контекста в сессии или еще где.

                                                      В общем, починили =)
                                                      1. Yani 21 ноября 2013, 13:48 # 0
                                                        «пришел, увидел, починил»
                                                        Спасибо)
                                      2. Володя 24 ноября 2013, 09:23 # 0
                                        Василий доброе утро. У тебя пагинация в поиске глючит вроде…
                                        1. Володя 24 ноября 2013, 09:36 # 0
                                          Уточню — глючит при большом количестве доков.
                                          попробуй например найти — «minishop» и пощелкай по пагинации… (переходы от 16 секунд)
                                          когда результатов немного — то вроде пашет нормально
                                          1. Василий Наумкин 24 ноября 2013, 11:33 # 0
                                            Это из-за фильтра по годам, убрал его.

                                            Видимо, где-то там косяк.
                                        2. Алексей Шевчук 17 декабря 2013, 15:43 # 0
                                          Подскажите пожалуйста.
                                          Я не силен в модексе, но делаю магазин и мне нужно в категории сделать сортировку товара по цене.
                                          вывожу я так
                                          [[!pdoPage? &element=`msProducts` &limit=`100` ]]

                                          я пробовал и так [[!pdoPage? &element=`msProducts` &sort=`ms|price:asc` &limit=`100` ]], но тут сниппет ничего не выводит
                                          1. Василий Наумкин 17 декабря 2013, 18:21 # 0
                                            А ты попробуй почитать документацию.
                                          2. Кирилл Лавров 15 января 2014, 03:29 # 0
                                            Можно ли отключить автоматический редирект на первую страницу, если любопытный юзер ввел что-то не то в параметр page?
                                            1. Василий Наумкин 15 января 2014, 08:07 # 0
                                              Нет.
                                              1. Илья Катасонов 11 мая 2014, 16:53 # 0
                                                Василий, добрый день) А можете добавить в след. обновлении возможность выбрать поведение pdoPage, в вышеописанном случае? К примеру параметр «errorCallback» со значениями «redirect» или «404» сотвественно.

                                                Необходимость в этой функции, возникает при подключении Jquery плагина InfiniteScroll к pdoPage+pdoResources

                                                Когда infinite подходит к концу каталога, он делает запрос на след. страницу (не существующую), и pdoPage ласково ему подпихивает редирект — на первую страницу в каталоге) И infinite не останавливается, и без конца выводит товары с первой странице каталога.

                                                Я для себя временно заменил редирект в коде:

                                                	public function redirectToFirst() {
                                                		unset($_GET[$this->pdoTools->config['pageVarKey']]);
                                                		unset($_GET[$this->modx->getOption('request_param_alias', null, 'q')]);
                                                		$this->modx->sendRedirect(
                                                			$this->modx->getOption('site_url'),
                                                			array('responseCode' => 'HTTP/1.1 404 Not Found')
                                                		);
                                                		/*$this->modx->sendRedirect(
                                                			$this->modx->makeUrl(
                                                				$this->modx->resource->id,
                                                				$this->modx->context->key,
                                                				$_GET,
                                                				'full'
                                                			)
                                                		);*/
                                                		return '';
                                                	}
                                                
                                                Но это костыль, и хочется, естественно чтобы было всё по-правильному.
                                                1. Василий Наумкин 11 мая 2014, 17:01 # 0
                                                  Если хочешь сделать правильно — объясни своему скрипту, что не нужно запрашивать несуществующую страницу.

                                                  pdoPage выставляет общее количество результатов в плейсхолдер [[+page.total]], общее количество страниц в [[+pageCount]], а текущую страницу — в [[+page]].
                                                  1. Илья Катасонов 11 мая 2014, 17:23 # 0
                                                    Намёк понял, благодарю)
                                            2. Пётр Молчанов 06 февраля 2014, 18:53 # 0
                                              Можно ли что-то придумать для выборки, если у мя берутся данные из 2х таблиц (отдельно), а потом сортируются в один массив по дате с помощью этой функции
                                              function cmp($a, $b) {
                                                              if ($a == $b) {
                                                                  return 0;
                                                              }
                                                              return ($a < $b) ? -1 : 1;
                                                          }
                                                          uasort($orders, 'cmp');
                                              ? Не знаю как запрос к этим 2м таблицам формировать… лимит и офсет
                                              1. yani 15 мая 2014, 17:35 # 0
                                                Возник вопрос, есть таблица с хранящимися в ней данными, возникла необходимость выводить их в web. В каком виде сниппет должен возвращать данные для PdoPage для корректного создания пагинации? Ни разу просто не задумывалась над этим (строила свою пагинацию).
                                                1. Василий Наумкин 15 мая 2014, 19:17 # 0
                                                  pdoResources умеет выводить данные из любых таблиц, для которых есть модель xPDO.

                                                  Ну а вообще — вот.
                                                2. Валерий Савинов 18 августа 2014, 14:39 # 0
                                                  Здравствуйте Василий!
                                                  Не могу разобраться с pdoPage и компонентом Gallery
                                                  вызовы получается таким:
                                                  [[!pdoPage? &element=`Gallery` &tag=`tagname` &limit=`30` &pageLimit=`10`]]
                                                  [[!+page.nav]]
                                                  Сами фотографии выводятся в соответствии с лимитом, но постраничной навигации нет…
                                                  Подскажите пожалуйста в чем может быть проблема?
                                                  1. Василий Наумкин 18 августа 2014, 14:43 # 0
                                                    Не знаю, видимо Gallery не поддерживает пагинацию.
                                                    1. Валерий Савинов 18 августа 2014, 15:46 # 0
                                                      но ведь с getPage поддерживает…
                                                      В общем после небольшого рыскания по интернетам выяснилось:
                                                      у Gallery нет параметра &offset, вместо него есть параметр &start.
                                                      Добавление строки:
                                                      $properties['start'] = $properties['offset'];
                                                      в сниппет getPage, проблему постраничной выдачи решает.
                                                      в случае же с pdoPage нужно добавить строку:
                                                      $scriptProperties['start'] = $scriptProperties['offset'];
                                                      после:
                                                      $scriptProperties['offset'] = empty($offset)
                                                      ? $scriptProperties['limit'] * $page — $scriptProperties['limit']
                                                      : $scriptProperties['limit'] * $page — $scriptProperties['limit'] + $offset;
                                                      она должна оказаться 65ой строкой.

                                                      вызов же на странице будет следующий:
                                                      [[!pdoPage? &element=`Gallery` &tag=`меткаФотографий` &limit=`30` &pageLimit=`10` &totalVar=`gallery.total`]]
                                                  Добавление новых комментариев отключено.