RealAdmin.ru

pdoTools в MODX — замена стандартных сниппетов

pdoTools,MODX
Категория: Сайтострой
27 Окт 2013 г. в 02:05

«pdoTools» — это пакет, содержащий инструменты для быстрой разработки сниппетов в MODX Revolution, а так же набор готовых сниппетов для повседневной работы. Именно о этих сниппетах и пойдёт речь в статье, а точнее о том, как я заменял ими стандартные «сниппеты» и для чего это делал.

Так чем же хорош компонент «pdoTools»? А тем, что позволяет создавать сниппеты без использования xPDO — MODX'овской надстройки над PHP расширением - PDO. Небольшое пояснение по этому поводу. Изначально все запросы к базе данных осуществлялись на SQL (структурированный язык запросов), и все бы хорошо, но вот синтаксис этих запросов к различным СУБД (MySQL, MSSQL, Oracle, FireBird...) зачастую отличается. Приходилось затачивать код под определенную СУБД и переписывать его при использовании с другой СУБД. Чтобы избежать данного неудобства для PHP было написано расширение PDO, которое позволило создать универсальный интерфейс для работы с базами данных. В MODX пошли дальше и для удобства разработки написали надстройку над PDO, которую назвали xPDO. Эта надстройка делает работу с БД из под MODX (а мы помним, что MODX, это не просто CMS, это CMF) ещё более удобной и безопасной, но за всё надо платить и в нашем случае это скорость работы. xPDO в качестве результата запроса возвращает объекты и при большом количестве возвращаемых объектов (тысячи) время генерации страницы значительно возрастает. Поэтому наш соотечественник Василий Наумкин решил разработать собственный инструмент для создания сниппетов, которые работают через PDO, а не через xPDO. Как вы поняли, инструмент этот и есть «pdoTools».

Далее последуют примеры, как я производил замены всем привычных сниппетов на сниппеты из пакета «pdoTools». Описывать все параметры этих сниппетов не вижу смысла, так как они уже есть на сайте разработчика, но на некоторых моментах я все же заострю внимание.

Замена getResources на pdoResources

Сниппеты для вывода ресурсов. Про эту замену я писал отдельную статью, она получилась не слишком содержательной, но кому-то может и пригодилась. Пример замены сниппета «getRecources» на «pdoRecources» с привязкой к «pdoPage» чуть ниже.

Замена getPage на pdoPage

Сниппеты для постраничного вывода ресурсов в MODX Revolution.

Как было:

[[!getPage@articlePaging?
    &elementClass=`modSnippet`
    &element=`getResources`
    &parents=`36,37,38,39,40`
    &depth=`1`
    &limit=`5`
    &includeTVs=`1`
    &tpl=`articleTpl`
]]

«articlePaging» — это набор параметров, где хранится содержимое чанков сниппета для оформления вывода. Для «pdoPage» я приведу их содержимое, так как оно несколько отличается от имеющихся в «getPage».

Как стало:

[[!pdoPage?
    &parents=`36,37,38,39,40`
    &depth=`1`
    &limit=`5`
    &includeTVs=`img-news,tags,HitsPage`
    &tpl=`articleTpl`
    &tplPageWrapper=`@INLINE [[+prev]][[+first]][[+pages]][[+last]][[+next]]`
    &tplPage=`@INLINE <a href="[[+href]]" class="pages" title="[[+pageNo]]">[[+pageNo]]</a>`
    &tplPageActive=`@INLINE <span class="current">[[+pageNo]]</span>`
    &tplPageFirst=`@INLINE <a class="pages" href="[[+href]]">First</a>`
    &tplPageLast=`@INLINE <a class="pages" href="[[+href]]">Last</a>`
    &tplPagePrev=`@INLINE <a href="[[+href]]">«</a>`
    &tplPageNext=`@INLINE <a href="[[+href]]">»</a>`
    &tplPageFirstEmpty=``
    &tplPageLastEmpty=``
    &tplPagePrevEmpty=``
    &tplPageNextEmpty=``
]]

Во-первых, пропали параметры «&elementClass» и «&element». Указывать их есть смысл только если в качестве источника постраничного вывода используется не «pdoRecources». Вместо «&includeTVs=`1`» пришлось указать имена всех tv параметров, участвующих в выводе. Остальные изменения связаны исключительно с чанками. В этом примере я специально отказался от использования набора параметров, чтобы вы увидели какие плейсхолдеры в каких чанках используются.

Замена getResourcesTag на pdoResources

В состав компонента getRecources входит так же сниппет getResourcesTag, предназначенный для вывода ресурсов, привязанных к определенному тегу. Этот сниппет так же можно заменить на pdoResources. Как было:
[[!getResourcesTag?
    &parents=`36,37,38,39,40`
    &depth=`1`
    &tpl=`articleTpl`
    &limit=`6`
    &includeTVs=`1`
]]
Как стало:
[[!pdoResources?
    &parents=`36,37,38,39,40`
    &depth=`1`
    &tpl=`articleTpl`
    &limit=`6`
    &includeTVs=`img-news,tags,HitsPage`
    &where=`{"tags:LIKE":"%[[!getUrlParam? &name=`tag`]]%"}`
]]

Сразу обращаем внимание на параметр — &where=`{"tags:LIKE":"%[[!getUrlParam? &name=`tag`]]%"}` В нём мы указываем критерий выборки ресурсов. Если простыми словами, то выбираем все ресурсы, у которых в TV параметре «tags» встречается слово, передаваемое в GET параметре «tag». А его, в свою очередь, мы вытаскиваем из URL с помощью сниппета getUrlParam, который вы можете установить из репозитория

Кстати, возможно есть и какие-то другие способы, если знаете, то поделитесь.

Замена breadCrumbs на pdoCrumbs

Как было:

[[Breadcrumbs? &homeCrumbTitle=`Главная`]]

Как стало:

[[pdoCrumbs?
    &showHome=`1`
    &outputSeparator=` » `
    &tplHome=`@INLINE Главная`
]]
После замены пришлось немного подредактировать CSS оформление выводимых хлебных крошек, так как «pdoCrumbs» в отличии от «BreadCrumbs» на выходе дает не список li, а просто набор ссылок, разделенных сепаратором, указанным в сниппете.

Замена Wayfinder на pdoMenu

Сниппеты предназначены для генерации меню на сайте. Здесь писать нечего, так как кроме замены названия сниппета менять ничего не пришлось. Выводимый результат остался тот же самый. Особого прироста в скорости генерации страницы я не заметил, но у меня небольшой сайт, поэтому это не удивительно.
[[pdoMenu? &startId=`0` &level=`2`]]

Замена GoogleSitemap на pdoSitemap

Сниппеты для генерации карты сайта. Заменяется только название. У меня на сайте есть отдельная статья по созданию карты сайта в modx revolution при помощи сниппета «GoogleSitemap» — Карта сайта в MODX Revolution (GoogleSiteMap). Для «pdoSitemap» делается всё аналогичным образом.
[[!pdoSitemap]]

Остальные сниппеты

В состав «pdoTools» входит ещё 2 сниппета. Я не применял их пока на практике, поэтому ничего писать про них не буду. Это сниппеты «pdoUsers» для вывода списка польователей сайта и «pdoNeighbors» для вывода соседних ресурсов.

На этом всё. Возможно, к тому моменту когда вы будете читать эту статью, появятся ещё статьи, связанные с пакетом «pdoTools». Найти их можно перейдя по соответствующему тегу. Про неточности в статье пишите в комментариях — буду исправлять.

Теги:
Посмотрите похожее — 6
Комментарии — 6
  1. avatar Justina666 03 апреля 2015, 13:21 #
    Как думаете, поможет ли замена getPage на pdoPage ускорить сайт? Очень getPage тормозит — по 8 сек грузится, куда копать пока не знаю :(
    1. avatar Simkin Andrew 03 апреля 2015, 22:45 #
      Смотря из-за чего тормозит сайт. Но вообще стоит использовать pdoTools, а так же Minifix для ускорения загрузки. Даёт хороший результат.
      1. avatar Stan 20 сентября 2015, 21:23 #
        Не только ускорит сайт, но и сократит количество устанавливаемых дополнений
        1. avatar Павел 18 ноября 2015, 16:47(был изменён) #
          Я уменьшил количество выводимых документов на странице и заменил всеми сниппетами из PDO. В итоге аптайм упал. Для станиц из базы колеблется от 0.5 — 1 для страниц из кеша от 0.01 до 0.3. Счастлив как паровоз. Уже думал если честно менять modx, на самопис.
        2. avatar Дмитрий 14 февраля 2016, 00:13 #
          [[!getUrlParam? &name=`tag`]]`
          В таком варианте длинные теги не будут работать, по умолчанию видит только 20 символов, поэтому желательно добавить парaметр max
          &where=`[[!getUrlParam? &name=`tag` &max=``]]`
          1. avatar Simkin Andrew 14 февраля 2016, 11:05 #
            спасибо, не знал
          © REALADMIN.RU   2016 г.
          Страница сгенерирована: 0,1003 s | 10 mb.
          На каком уровне Вы играете в шахматы?
          О П Р О С
          Home Question Top