Замена getResources на pdoResources в MODX Revolution
Категория: Разработка сайтов
Вчера решил попробовать заменить на сайте вывода ресурсов с «getResources» на «pdoResources». Результат превзошел все ожидания. Время загрузки кешируемой главной страницы уменьшилось с 1.1 сек до 0.76 сек.
Переход занимает менее 10 минут. Достаточно установить из репозитория пакет pdoTools (про пакет «pdoTools» и остальные его сниппеты я написал отдельную статью — pdoTools в MODX Revoluton — замена стандартных сниппетов) и сделать несколько правок.
Меняем название getResources на pdoResources
Само собой разумеющийся пункт и здесь хотелось бы лишь отметить, что если для вывода ресурсов у вас используется постраничная навигация («getPages»), то это никак не помешает переходу. Точно так же применяйте вместо элемента вывода getResources — pdoResources. Различие в параметрах будет лишь одно. О нем ниже.
Включение TV параметров в вывод
В «getResources» указывается значение 1 если требуется включать TV параметры в результат вывода и 0, если не требуется:
&includeTVs=`1`
В «pdoResources» необходимо указывать имена TV параметров через запятую:
&includeTVs=`img-news,tags`
Вывод даты публикации ресурса
В getResources:
Опубликовано: [[+publishedon:strtotime:date=`%d %b %Yг. в %H:%M`]]
В pdoResources убираем промежуточную функцию «strtotime»:
Опубликовано: [[+publishedon:date=`%d %b %Yг. в %H:%M`]]
Замена «getResourcesTag»
Вместе с «getResources» идет сниппет «getResourcesTag», который выводит ресурсы по тегу. «pdoResources» может заменить и его. Я реализовал замену включением в «pdoResources» следующего параметра:
&where=`{"tags:LIKE":"%[[!getUrlParam? &name=`tag`]]%"}`
Он указывает на то, что требуется вывести только те статьи, у которых в TV-поле «tags» встречается слово, передаваемое в адресной строке в параметре «tag».
Для получения этого параметра я использую snippet «getUrlParam». Устанавливается он из репозитория как обычный пакет. Он предназначен для вывода значения переменной, передаваемой в адресной строке методом GET.
Параметр «conditionalTpls»
Этот пункт здесь лишний, так как данный параметр есть как у первого сниппета, так и у второго. Однако, узнал я о его существовании только когда начал разбираться c «pdoResources».
-
&conditionalTpls — параметр применяется в сниппетах pdoResources/getResources при необходимости осуществить вывод отдельных ресурсов в «свои» чанки:
[[!pdoResources? &parents=`2` &tpl=`chunk1` &tplCondition=`pagetitle` &tplOperator=`==` &conditionalTpls=`{"Статья 2":"chunk2", "Статья 5":"chunk3"}` ]]
-
&tplCondition — Поле ресурса, из которого будет получено значение для выбора чанка по условию в «conditionalTpls». Например: pagetitle или alias.
-
&tplOperator — оператор сравнения, возможный список: ==, !=, , =, empty, !empty, isnull
-
&conditionalTpls — строка с массивом, в котором указано то, с чем будет сравниваться «tplCondition», а в значениях — чанки, которые будут использованы для вывода, если сравнение будет успешным.
Дополнения MODX
В этом разделе я собрал дополнения (модули MODX), которые я устанавливаю сразу после разворачивания дистрибутива при разработке сайтов. Среди этих дополнений есть как обычные сниппеты MODX, выполняющие те или иные функции, так и полноценныые модули со своей страничкой в разделе «Компоненты» в админкеРядом с каждым дополнением есть ссылка на его страничку в официальном репозитории и на последнюю сохраненную версию на моем сайте. По возможности, скачивайте версию из официального репозитория (если он доступен) — ведь я не могу поддерживать версии всех дополнений в актуальном состоянии.
Надеюсь, я не нарушил никаких лицензий.
pdoTools
Репозиторий С сайта
Компонент-замена нескольких пакетов для выборки ресурсов или других объектов. От своих аналогов отличается скоростью. В состав входят следующие сниппеты:
- pdoResources — Выводит списки ресурсов. Полноценная замена getResources
- pdoSitemap — Выводит xml-карту сайта. Аналог GoogleSiteMap
- pdoCrumbs — Добавляет на сайт навигацию в виде хлебных крошек. Заменяет Breadcrumb
- pdoField — Предоставляет доступ к полям ресурсов. Заменяет одновременно getResourceField и UltimateParent
- pdoUsers — Выводит список пользователей сайта. Поддерживает фильтрацию по группам пользователей
- pdoNeighbors — Показывает ссылки на следущий и предыдущий ресурсы
- pdoPage — Реализует постраничность, так же, как и getPage
- pdoMenu — Выводит меню на сайте в виде списка ссылок. Аналог Wayfinder
Ace
Репозиторий С сайта
Подсветка синтаксиса в админке для чанков, сниппетов и пр. Дополнение нереально крутое — есть даже автодополнение. Если вы пользуетесь CodeMirror или прочими пакетами для подсветки — просто попробуйте 🙂
autoRedirector
(модуль MODX)Репозиторий С сайта
Компонент отслеживает изменения адресов страниц на сайте и, если вы меняете адрес какой-то страницы, автоматически проставляет редирект. Можно использовать вместо Redirector, так как позволяет в админке вручную добавить любое правило редиректа.
Batcher
(модуль MODX)Репозиторий С сайта
Дополнение позволяет массово переключить у ресурсов шаблон, состояния Показывать/Не показывать, Опубликован/Не опубликован и пр. Редко когда пригождается, но пару раз он меня очень выручал.
BreadCrumb
(сниппет)Репозиторий С сайта
На мой взгляд, самое простое дополнение, добавляющее на сайт навигацию в форме хлебных крошек.
Console
(модуль MODX)Репозиторий С сайта
Добавляет в админ-панель консоль, в которой можно тестировать php-код и сразу же видеть результат его выполнения. Очень выручает, когда надо сделать какую-нибудь хитрую выборку или отладить какой-то кусок кода.
DirectResize2
Репозиторий С сайта
Уменьшает вставленные в контент изображения до нужного размера, подключая одну из трех JS-библиотек, которые увеличивают картинки по клику. В итоге сайт загружается быстрее, так как картинки все «ужаты».
FastUploadTV
Репозиторий С сайта
Добавляет новый тип ТВ-параметров для упрощенной загрузки картинок контент-менеджером. Этот ТВ представляет из себя кнопку, при нажатии на которую открывается окно выбора файла. Выбранный файл загружается на сайт в предварительно указанную папку и прикрепляется к ресурсу.
FormIt
(сниппет)Репозиторий С сайта
Обрабатывает любые формы. Позволяет сделать валидацию полей форм, после чего передает данные в указанный сниппет для дальнейшей обработки. Может отправлять почту. Часто используется для создания контактных форм на сайте, но этим его возможности далеко не органичиваются.
Советую уделить этому сниппету много внимания и изучить все его возможности.AjaxForm
(сниппет)Репозиторий С сайта
Добавляет возможность реализовать отправку любой формы через AJAX. Хорошо взаимодействует с FormIt и по умолчанию настроен на автоматическую работу с такими формами.
MinifyX
(сниппет)Репозиторий С сайта
Объединяет и минифицирует стили и скрипты на сайте. Если вызывать некешированным, то отслеживает изменения файлов и пересобирает результирующий файл.
Gallery
(модуль MODX)Репозиторий С сайта
Создавайте альбомы, в которые загружайте любое количество изображений. Очень удобный интерфейс в админке и очень простой сниппет вывода галереи на сайте. Есть возможность прикрепить к каждому документу на сайте свою галерею (см. Управление альбомом галереи на странице ресурса).
impArt
(модуль MODX)Репозиторий С сайта
Предназначен для массового добавления статей на сайт.
Login
(сниппет)Репозиторий С сайта
Позволяет реализовать на сайте регистрацию для пользователей, форму авторизации, личный кабинет. Пример того, как это все можно сделать, читайте в статье Авторизация, регистрация пользователей, личный кабинет и основы контроля доступа в MODX Revolution.
MIGX
(модуль MODX)Репозиторий С сайта
Даёт возможность создавать в админке табличные ТВ-параметры с удобным интерфейсом добавления и редактирования строк.
modLastModified
Репозиторий С сайта
Возвращает пользователям (и поисковикам) заголовки Last-Modified и Not modified. Благодаря этому поисковики смогут чаще приходить на ваш сайт, чтобы проверить изменения — ведь нагрузка на их серверы будет меньше благодаря этим заголовкам.
phpThumbOn
(сниппет)Репозиторий С сайта
Позволяет ресайзить картинки на сервере.
Создает превьюшки, обрезает картинки, накладывает водяные знаки и пр.simpleUpdater
Репозиторий С сайта
Добавляет в раздел «Приложения» пункт «Обновить MODX», в котором вы можете провести апгрейд системы всего одной кнопкой.
CKEditor
Репозиторий С сайта
Визуальный редактор для ресурсов в админке MODX. Аккуратная и симпатичная панель инструментов, чистый код.
Collections
Репозиторий С сайта
Создаёт отдельный тип ресурса — коллекцию. Дочерние ресурсы коллекции не показываются в дереве, а отображаются на странице в виде удобной таблички. Идеально для разделов новостей или блогов
Translit
Репозиторий С сайта
Транслитерирует названия ресурсов, прежде чем установить в качестве псевдонима. Здесь локальная версия отличается от версии в репозитории несколько другой таблицей транслитерации. Например, в официальной версии буква «Ц» будет преобразована в «cz», а в локальной версии — в «c».
VersionX
(модуль MODX)Репозиторий С сайта
Создает локальные бекапы всех элементов — от чанков до ресурсов. Вы всегда сможете посмотреть старую версию и, если надо, восстановить ее. Кроме того, можно узнать, кто именно внес те или иные изменения.
xPoller
(модуль MODX)Репозиторий С сайта
Компонент для организации AJAX-опросов для вашего сайта
SiteHeart
Репозиторий С сайта
Добавляет на сайт чат онлайн-поддержки от SiteHeart
Подборка полезных дополнений из репозитория
- Подборка дополнений, которые могут однажды пригодиться. Часть 1
- Подборка дополнений, которые могут однажды пригодиться. Часть 2
- Подборка дополнений, которые могут однажды пригодиться. Часть 3
Немного подробностей по другим дополнениям
- [scannerMODX] — проверьте целостность ядра MODX
- simpleUpdater 2.1.1 — Возвращён пункт в меню «Приложения»
- siteExtra 1.4.0 — поддержка синтаксиса Fenom
- simpleUpdater 2.1.0
- Очень простое добавление кастомных объектов в MODX
- Как обновить MODX одной кнопкой
- LangCorrect-0. 0.1 — Изменяем неверную раскладку запросов
- SiteHeart — онлайн чат для сайта
- xPoller — опросы для MODX
- Отправляем заголовки Last-Modified и Not Modified
- Новая версия Sendex
- impArt — массовая заливка статей на сайт
- autoRedirector — Автоматический редирект при изменении адреса страницы
- Units — правильно указываем окончания для количественных обозначений
- Новый раздел на сайте — Шаблоны для MODX Revolution
- Модификация getPage для приведения пагинации к общепризнанным стандартам
- editLinksNet — мое первое дополнение в официальном репозитории MODX
- Шаблон Acallia для MODX
- Плагин для переключения контекстов при отсутствии нужного URL в текущем контексте
- Галерея в стиле Вконтакте или Яндекс.Картинок
- Плагин для редиректа если страница перенесена или изменен URL страницы
- Небольшой плагин для редиректа если страница перенесена
- Автоматизация перелинковки сайта в MODX REVO
Авторизация
через сервис Loginza:
Шаблоны MODX
1 2 Дальше »
Объектная
модель
MODX
getResources и pdoResources обрабатывают &where очень по-разному — Общие
rdegler
1
У меня возникли проблемы с тем, что pdoResources не извлекает правильные ресурсы при использовании фильтрации &where.
Когда я добавляю &where, pdoResouces не ограничивает запрос выбранными &parents, а вместо этого запрашивает весь контекст:
Следующее работает и ограничивает себя дочерними ресурсами 617
[[!pdoResources? &parents=`617` &limit=`0` &includeTVs=`отчет о собрании` &tvPrefix=`` &tpl=`таблица-отчетов-по-создателю-tpl` &showHidden=`1` ]]
Однако это включает все результаты, ДАЖЕ ресурсы, которые не являются дочерними для ресурса 617, но применяют ограничение &where для возврата только двух шаблонов.
[[!pdoResources? &parents=`617` &limit=`0` &includeTVs=`отчет о собрании` &tvPrefix=`` &tpl=`таблица-отчетов-по-создателю-tpl` &showHidden=`0` &where=`{"шаблон:=":9, "ИЛИ:шаблон:=":10}` ]]
getResources работает правильно:
[[!getResources? &parents=`617` &limit=`0` &includeTVs=`1` &tvPrefix=`` &tpl=`таблица-отчетов-по-создателю-tpl` &showHidden=`0` &where=`{"template:=":9, "ИЛИ:template:=":10}` ]]
Количество ресурсов значительно возрастет, и я думаю, что pdoResources будет намного быстрее при запросе тысяч записей.
Система : Modx 2.8.4 на modxcloud
Любой совет будет очень полезен.
Спасибо
Рой
полутренированный Гарри
2
Попробуйте использовать массив в свойстве , где :
&where=`[{"template:=":9, "OR:template:=":10}]`
Добавьте свойство &showLog=`1`
и проверьте SQL-запрос, чтобы убедиться, что скобки в условиях where теперь верны.
редеглер
4
Я использовал оператор where, как указано в этом потоке, и как массив IN. Оба успешно ограничивают вывод ресурсами с указанными идентификаторами шаблонов.
Проблема возникает из-за того, что pdoResources игнорирует &parents= 617
и вместо этого возвращает ресурсы с шаблоном, ВКЛЮЧАЯ ресурсы, которые не являются дочерними элементами ресурса с идентификатором 617. Похоже, что &where заставляет pdoResources на игнорировать идентификаторы в параметре &parent.
Корректно работает при использовании getResources. Является ли использование getResources намного медленнее, чем pdoResources, при возврате тысяч ресурсов?
Я был убежден, что pdoResources работает значительно быстрее.
Может ли это быть ошибкой с pdoResources? Должен ли я сообщить о проблеме?
Рой
полутренированный Гарри
5
Если свойство where равно &where=`{"template:=":9, "OR:template:=":10}`
, тогда SQL-запрос будет
SELECT * ИЗ `modx_site_content` КАК `modResource` ГДЕ ( `modResource`. `шаблон` = 9 ИЛИ `modResource`.`шаблон` = 10 И `modResource`.`parent` В (1,2,3,4,5) И `modResource`.`опубликовано` = 1 И `modResource`.`hidemenu` = 0 И `modResource`.`deleted` = 0 )
, что является проблемой, потому что И имеет приоритет над ИЛИ. Если шаблон
равен 9
, то ресурс всегда находится в результате, независимо от того, каковы значения родительского
, опубликованного
и т.д.
То же, что и
ГДЕ ( (`modResource`.`template` = 9) ИЛИ ( `modResource`.`template` = 10 И `modResource`.`parent` В (1,2,3,4,5) И `modResource`.`published` = 1 И `modResource`.`hidemenu` = 0 И `modResource`.`deleted` = 0 ) )
Однако со свойством where &where=`[{"template:=":9, "OR:template:=":10}]`
, теперь вокруг условия ИЛИ заключены скобки, и запрос должен быть правильным.
ВЫБЕРИТЕ * ИЗ `modx_site_content` КАК `modResource` ГДЕ ( (`modResource`.`template` = 9 ИЛИ `modResource`.`template` = 10) И `modResource`. `parent` В (1,2,3,4,5) И `modResource`.`опубликовано` = 1 И `modResource`.`hidemenu` = 0 И `modResource`.`deleted` = 0 )
Используя &where=`[{"template:IN":[9,10]}]`
, запрос также должен быть правильным.
ВЫБЕРИТЕ * ИЗ `modx_site_content` КАК `modResource` ГДЕ ( `modResource`.`template` IN (9,10) И `modResource`.`parent` В (1,2,3,4,5) И `modResource`.`опубликовано` = 1 И `modResource`.`hidemenu` = 0 И `modResource`.`deleted` = 0 )
редеглер
6
Спасибо, Ваше объяснение действительно прояснило проблему.
Я выбрал подход IN Array. Поскольку мы, вероятно, разработаем третий шаблон для ресурсов, хранящихся в архивах. После реализации будет намного проще добавлять вызовы pdoResource.
Я думал, что такие параметры, как &parents и &resources, будут иметь приоритет над другими параметрами, такими как &where и &tvfilters. В результате (&parents AND &resources) затем применяются (другие ограничения фильтрации).
Я воспользуюсь &showlog= 1
и освежу свои знания SQL-запросов, когда столкнусь с неожиданными результатами.
Кажется, логические операторы, такие как AND, OR и NOT, в последнее время были в центре моего внимания в MODX. Мы работаем над тем, чтобы добавить их в возможности поиска по сайтам MODX.
Мы очень признательны за вашу помощь. Большое спасибо
Рой
система Закрыто
7
Эта тема была автоматически закрыта через 2 дня после окончания обсуждения и отмеченного решения. Новые ответы больше не допускаются. Вы можете открыть новую тему, щелкнув значок ссылки под исходным сообщением или решением и выбрав «+ Новая тема».
Pdoresources: показывать ресурсы в указанном порядке (отсортировано вручную)
frischnetz
1
Привет!
Как указать точный порядок, в котором pdoresources перечисляет результаты?
Я хочу отобразить список с &resources=`9,3,6`
и получить ресурсы 9,3 и 6 в указанном порядке. Возможный?
Люси
2
Это может сработать?
&sortby=`{id:9,3,6}`
Если нет, вы можете сортировать на любом телевизоре, например, можно установить индекс меню для этих ресурсов на 1, 2, 3 соответственно, а затем использовать:
&sortby=`{menuindex:ASC}`
Фришнец
3
sortby=`{id:9,3,6}`
Нет, это выдает ошибку:
Неустранимая ошибка : Uncaught TypeError: Аргумент 1, переданный в pdoFetch::replaceTVCondition(), должен иметь тип array, значение null задано
(Сортировка с помощью menuindex здесь невозможна)
Бруно17
4
возможно
&sortby=`FIELD(modResource.id, 4,7,2,5,1)` &sortdir=`ASC`
Люси
5
Может нужны кронштейны?
sortby=`{id:[9,3,6]}`
Фришнец