Jump to main content Jump to doc navigation

После чистой установки MODX часто ставят набор extras для функциональности сайта.

Обычный набор знаком:

  • getResources для списков документов
  • getPage для пагинации списков
  • Wayfinder для меню
  • Breadcrumb(s) для хлебных крошек
  • GoogleSitemap для sitemap

Всё это можно заменить одним пакетом: pdoTools.

Ниже краткий обзор возможностей.

9 сниппетов

Серьёзно. В pdoTools 9 сниппетов, которых хватает почти для любого обычного сайта. Большинство из них можно поставить вместо популярных аналогов.

pdoResources

pdoResources заменяет getResources. Как и остальные сниппеты pdoTools, он не использует объекты xPDO для вывода ресурсов. Работает напрямую с таблицами БД. Так быстрее. Не нужно переводить даты ресурсов в timestamps перед фильтром date. TV подключаются только нужные, поэтому перечисляйте их в &includeTVs через запятую.

[[!pdoResources?
    &parents=`0`
    &includeTVs=`my_tv1,my_tv2`
    &tvPrefix=`tv.`
    &processTVs=`1`
    &includeContent=`1`
    &showLog=`1`
]]

Одно из важных свойств pdoTools: &showLog. По нему видно, насколько быстр сниппет. Тормозит SQL или слишком сложный чанк? &showLog помогает это увидеть.

Вторая важная возможность: SQL joins. Через pdoTools собирают сложные запросы и выбирают только нужное.

[[!pdoResources?
    &parents=`0`
    &class=`modResource`
    &leftJoin=`{
        "Parent": {
            "class": "modResource",
            "on": "modResource.parent = Parent.id"
        },
        "CreatedBy": {
            "class": "modUserProfile",
            "on": "modResource.createdby = CreatedBy.internalKey"
        }
    }`
    &select=`{
        "modResource": "modResource.id, modResource.pagetitle",
        "Parent": "Parent.pagetitle as parent",
        "CreatedBy": "CreatedBy.fullname as author"
    }`
    &showLog=`1`
]]

В примере выше не нужны отдельные сниппеты и output filters, чтобы получить родителя ресурса или имя автора. Насколько быстро? Смотрите лог.

Есть и другие фичи, но эти две главные.

pdoPage

pdoPage заменяет getPage. Отличия от getPage:

  1. Пустые страницы не показывает. Нет результатов или пользователь вручную открыл неверную страницу: редирект на первую.
  2. Есть &maxLimit, по умолчанию 100. Пользователь не сможет замедлить сайт через &limit=100000 в URL. Если у вас getPage, попробуйте так на своём сайте.
  3. В header страницы ставит metatags previous/next для краулеров.
  4. Есть встроенная ajax-пагинация. Пример:
<div id="pdopage">
    <div class="rows">
        [[!pdoPage?
            &parents=`0`
            &ajaxMode=`default`
        ]]
    </div>
    [[!+page.nav]]
</div>

Разметку можно менять дополнительными параметрами сниппета.

pdoMenu

Этот сниппет может заменить Wayfinder. Работает похоже, но чуть быстрее.

Так как объекты xPDO обходятся, права пунктов меню проверяйте вручную специальным свойством:

[[!pdoMenu?
    &parents=`0`
    &checkPermissions=`list`
]]

По умолчанию проверки прав выключены. Это свойство, кстати, есть у всех сниппетов pdoTools.

pdoUsers

Сниппет выводит пользователей сайта. Фильтруйте по группам и ролям:

[[!pdoUsers?
    &groups=`Authors`
    &sortdir=`asc`
]]

Можно совместить с pdoPage для списка с пагинацией:

[[!pdoPage?
    &element=`pdoUsers`
    &groups=`Authors`
    &roles=`Member`
    &sortby=`id`
    &sortdir=`asc`
]]
[[!+page.nav]]

Плейсхолдеры: все поля объектов modUser и modUserProfile. Чтобы увидеть их, задайте пустой &tpl (или не задавайте, если у сниппета нет tpl по умолчанию).

Пустой &tpl это ещё одна общая фича всех сниппетов pdoTools.

pdoSitemap

pdoSitemap строит быстрый sitemap. Ресурс не обязан быть XML, если включено &forceXML (по умолчанию).

Данные кэшируются. Ключ кэша зависит от параметров сниппета, но можно задать свой.

Чтобы оценить скорость, отключите &forceXML и включите &showLog. На моём сайте первый прогон около 30 секунд, второй около 0.03:

[[!pdoSitemap?
    &forceXML=`0`
    &showLog=`1`
]]

В sitemap 6873 ресурса.

pdoNeighbors

Сниппет для ссылок на предыдущую, следующую и родительскую страницы текущего документа.

[[!pdoNeighbors?
    &sortby=`menuindex`
    &sortdirc=`desc`
]]

Просто соседи.

pdoCrumbs

Мой вариант простого сниппета хлебных крошек. Ничего необычного, кроме ядра pdoTools с быстрыми чанками и выборкой данных.

[[!pdoCrumbs]]

pdoTitle

Сниппет собирает тег title страниц. Вызывает pdoCrumbs и показывает путь к текущему документу в title.

<title>[[!pdoTitle]] / [[++site_name]]</title>

По умолчанию поддерживает pdoPage, поэтому в title видно номер страницы.

<title>Questions / page 5 from 593 / Sections / mysite.com</title>

Краулеры это любят.

pdoField

И наконец pdoField: любое поле любого ресурса. Заменяет и UltimateParent, и getResourceField.

Пример: нужен longtitle ресурса с id = 15

[[pdoField?
    &id=`15`
    &field=`longtitle`
]]

Или pagetitle «дедушки» текущего документа:

[[pdoField?
    &id=`[[*id]]`
    &field=`pagetitle`
    &top=`2`
]]

Заключение

Все сниппеты pdoTools используют одно ядро, и большинство параметров работает у всех.

Через &showLog смотрите, как работают сниппеты. Пустые чанки показывают доступные плейсхолдеры. Таблицы можно join-ить на лету.

pdoTools это библиотека, а не просто набор сниппетов. Многие extras MODX используют pdoTools для своих сниппетов: miniShop2, Tickets, BannerY, AjaxForm и другие.

Не забывайте: параметры описаны внутри сниппетов. Откройте сниппет в Менеджере и смотрите вкладку Properties.

Support the team building MODX with a monthly donation.

The budget raised through OpenCollective is transparent, including payouts, and any contributor can apply to be paid for their work on MODX.

Backers

  • modmore
  • STERC
  • Digital Penguin
  • Jens Wittmann – Gestaltung & Entwicklung
  • CrewMark
  • Fabian Christen
  • Sepia River Studios
  • Dannevang Digital
  • Alex
  • A. Moreno
  • Chris Fickling
  • Stéphane Jäggi
  • Murray Wood
  • Anton Tarasov
  • deJaya
  • JT Skaggs
  • Lefthandmedia
  • eydolan
  • Following Sea
  • Guido Gallenkamp
  • YJ
  • Raffy
  • Snow Creative
  • Nick Clark
  • Guest
  • Helen
  • krisznet
  • Yanni
  • Richard

Budget

$204 per month—let's make that $500!

Learn more