pdoField — получение полей ресурсов и родителей в MODX

pdoField Дополнения

Сниппет pdoField предназначен для быстрой выборки любого поля указанного ресурса или его родителя, включая TV-параметры. Он объединяет возможности устаревших сниппетов getResourceField и UltimateParent, позволяя получать данные из документов любых контекстов с гибкой настройкой условий выборки. Основное применение — вывод полей родительских ресурсов, работа с иерархией документов и получение данных любых объектов MODX через параметр &class.

Уникальная особенность pdoField — возможность вызова как обычного сниппета и как фильтра вывода, что делает его чрезвычайно гибким инструментом. Сниппет поддерживает дополнительные параметры выборки, позволяя, например, не выводить поля скрытых или удаленных ресурсов.

Базовый синтаксис использования

Простейший вызов для вывода поля текущего ресурса:

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

Вызов как фильтр вывода (более короткая форма):

[[*id:pdofield=`pagetitle`]]

Получение поля родителя текущей страницы:

[[pdoField? &id=`[[*id]]` &field=`longtitle` &top=`1` ]]

Вывод TV-параметра родительского ресурса:

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

Параметры

Принимает общие параметры выборки и результатов pdoTools и некоторые свои.

Параметр Значение по умолчанию Описание
&id ID текущей страницы ID ресурса для получения поля
&field pagetitle Имя поля или TV-параметра для вывода
&top 0 Подняться на N уровней вверх по иерархии
&topLevel 0 Выбрать родителя на уровне N от корня
&default Резервное поле если основное пустое (быстрая альтернатива :default=)
&output Строка для вывода если оба поля пусты
&class modResource Класс объекта для выборки
&context текущий Контекст для поиска ресурса
&showHidden 1 Выводить поля скрытых ресурсов
&showUnpublished 0 Выводить поля неопубликованных
&showDeleted 0 Выводить поля удаленных
&tvPrefix tv. Префикс для TV-параметров
&toPlaceholder Сохранить в плейсхолдер
&showLog 0 Показать отладочную информацию

Вызов как фильтр вывода

PdoField можно вызывать как модификатор вывода для более компактного синтаксиса.

Получение заголовка ресурса:

[[*id:pdofield=`pagetitle`]]

Получение поля с параметрами через JSON:

[[*id:pdofield=`{"top":2,"field":"pagetitle"}`]]

Получение longtitle второго родителя:

[[*id:pdofield=`{"top":2,"field":"longtitle"}`]]

Получение TV-параметра с дефолтным значением:

[[*id:pdofield=`{"field":"image","default":"introtext"}`]]

Обычный вызов сниппета более читаем и рекомендуется для сложных случаев.

Работа с иерархией ресурсов

Параметр &top — подъем вверх

Параметр &top определяет на сколько уровней подняться от указанного ресурса.

Получение поля непосредственного родителя (1 уровень вверх):

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

Получение поля «дедушки» (2 уровня вверх):

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

Получение поля третьего родителя:

[[pdoField? &id=`[[*id]]` &field=`description` &top=`3` ]]

Если указать слишком большое значение top, сниппет вернет поле корневого ресурса контекста.

Параметр &topLevel — уровень от корня

Параметр &topLevel выбирает родителя на определенном уровне от корня контекста.

Получение поля ресурса первого уровня (прямой потомок корня):

[[pdoField? &id=`[[*id]]` &field=`pagetitle` &topLevel=`1` ]]

Получение поля ресурса второго уровня:

[[pdoField? &id=`[[*id]]` &field=`menutitle` &topLevel=`2` ]]

Разница между &top и &topLevel:

  • &top=2 — поднимается на 2 уровня вверх от текущего ресурса (относительный путь)
  • &topLevel=2 — выбирает родителя на 2-м уровне от корня (абсолютный путь)

Работа с TV-параметрами

PdoField автоматически обрабатывает TV-параметры как обычные поля.

Получение TV текущего ресурса:

[[pdoField? &id=`[[*id]]` &field=`product_image` ]]

Получение TV родительского ресурса:

[[pdoField? &id=`[[*id]]` &field=`category_banner` &top=`1` ]]

Получение TV с обработкой модификаторами:

[[pdoField? &id=`[[*parent]]` &field=`category_image` &tvPrefix=`` :pthumb=`w=400&h=200&zc=1`]]

TV обрабатываются согласно настройкам типа ввода в менеджере MODX.

Использование параметров default и output

Параметр &default

Параметр &default возвращает указанное поле если основное поле пусто:

[[pdoField? &id=`[[*id]]` &field=`longtitle` &default=`pagetitle` ]]

Это быстрая альтернатива модификатору :default=.

Пример с TV-параметрами:

[[pdoField? &id=`[[*id]]` &field=`featured_image` &default=`main_image` ]]

Параметр &output

Параметр &output возвращает указанную строку если оба поля (field и default) пусты:

[[pdoField? &id=`[[*id]]` &field=`banner` &default=`image` &output=`/assets/images/default-banner.jpg` ]]

Цепочка приоритетов: field → default → output.

Работа с разными классами объектов

Параметр &class позволяет получать поля любых объектов MODX.

Получение поля пользователя:

[[pdoField? &class=`modUser` &id=`[[*createdby]]` &field=`username` ]]

Получение данных профиля пользователя:

[[pdoField? &class=`modUserProfile` &id=`[[*createdby]]` &field=`fullname` ]]

Получение настройки контекста:

[[pdoField? &class=`modContextSetting` &id=`site_name` &field=`value` ]]

Получение поля категории:

[[pdoField? &class=`modCategory` &id=`5` &field=`category` ]]

Фильтрация скрытых ресурсов

PdoField поддерживает параметры фильтрации для контроля видимости.

Не выводить поля скрытых ресурсов:

[[pdoField? &id=`[[*parent]]` &field=`pagetitle` &showHidden=`0` ]]

Не выводить поля неопубликованных ресурсов:

[[pdoField? &id=`[[*id]]` &field=`banner` &top=`1` &showUnpublished=`0` ]]

Игнорировать удаленные ресурсы:

[[pdoField? &id=`10` &field=`content` &showDeleted=`0` ]]

Работа в разных контекстах

PdoField умеет получать поля ресурсов из любых контекстов.

Получение поля ресурса из другого контекста:

[[pdoField? &id=`5` &field=`pagetitle` &context=`en`]]

Получение поля родителя в мультиконтекстном проекте:

[[pdoField? &id=`[[*id]]` &field=`category_name` &top=`1` &context=`web`]]

Практические примеры использования

Вывод заголовка раздела в хлебных крошках

Получение названия родительской категории:

<nav class="breadcrumb">
  <a href="/">Главная</a> / 
  <a href="[[~[[*parent]]]]">
    [[pdoField?
    &id=`[[*parent]]`
    &field=`menutitle`
    &default=`pagetitle`
    ]]
  </a> / 
  <span>[[*pagetitle]]</span>
</nav>

Использование баннера родительского раздела если у текущей страницы его нет:

<div class="page-banner" style="background-image: url([[pdoField?
&id=`[[*id]]`
&field=`banner_image`
&top=`1`
&default=`default_banner`
&output=`/assets/images/default-bg.jpg`
:pthumb=`w=1920&h=400&zc=1`
]]);">
  <h1>[[*pagetitle]]</h1>
</div>

Информация об авторе статьи

Получение данных автора через createdby:

<div class="post-author">
  <div class="author-avatar">
    <img src="[[pdoField?
    &class=`modUserProfile`
    &id=`[[*createdby]]`
    &field=`photo`
    &output=`/assets/images/default-avatar.png`
    ]]" alt="Автор">
  </div>
  <div class="author-info">
    <h4>[[pdoField?
    &class=`modUserProfile`
    &id=`[[*createdby]]`
    &field=`fullname`
    &default=`username`
    ]]</h4>
    <p>[[pdoField?
    &class=`modUserProfile`
    &id=`[[*createdby]]`
    &field=`extended.bio`
    ]]</p>
  </div>
</div>

SEO описание из иерархии

Каскадное получение мета-описания:

<meta name="description" content="[[pdoField?
&id=`[[*id]]`
&field=`description`
&top=`1`
&default=`introtext`
&output=`Интернет-магазин с доставкой по всей России`
:limit=`160`
]]">

Логотип из главной страницы контекста

Получение логотипа для всех страниц сайта:

<img src="[[pdoField? &id=`0` &field=`site_logo` &output=`/assets/images/logo.png` ]]" alt="[[++site_name]]">

Вызов через Fenom

Использование шаблонизатора Fenom для более чистого синтаксиса:

{'pdoField' | snippet : [
'id' => $_modx->resource.id,
'field' => 'longtitle',
'top' => '2',
'default' => 'pagetitle'
]}

Получение поля родителя на Fenom:

{set $categoryName = 'pdoField' | snippet : [
'id' => $_modx->resource.parent,
'field' => 'menutitle',
'default' => 'pagetitle'
]}

<h2>{$categoryName}</h2>

Вывод баннера с fallback:

{set $banner = 'pdoField' | snippet : [
'id' => $_modx->resource.id,
'field' => 'banner_image',
'top' => 1,
'output' => '/assets/images/default-banner.jpg'
]}

<img src="{$banner | pthumb : 'w=1200&h=300&zc=1'}" alt="Banner">

Комбинация с другими сниппетами

Использование в pdoResources

Вывод поля родителя внутри списка ресурсов:

[[pdoResources?
&parents=`10`
&tpl=`@INLINE 
<div class="item">
  <span class="category">
    [[pdoField?
    &id=`[[+parent]]`
    &field=`menutitle`
    ]]
  </span>
  <h3>[[+pagetitle]]</h3>
  <p>[[+introtext]]</p>
</div>`
]]

Условный вывод с pdoField

Проверка наличия поля у родителя:

{set $parentBanner = 'pdoField' | snippet : [
'id' => $_modx->resource.parent,
'field' => 'category_banner'
]}

{if $parentBanner}
<div class="category-header" style="background-image: url({$parentBanner});">
  <h1>{$_modx->resource.pagetitle}</h1>
</div>
{/if}

Отладка и логирование

Включение подробного лога для отладки:

[[pdoField? &id=`[[*id]]` &field=`banner` &top=`2` &showLog=`1`]]

Лог покажет какой именно ресурс был выбран и какое поле возвращено.

Сравнение с аналогами

Преимущества pdoField над getResourceField:

  • Работает с любыми контекстами
  • Поддерживает навигацию по иерархии через &top и &topLevel
  • Может получать поля любых объектов MODX через &class
  • Фильтрует скрытые и удаленные ресурсы
  • Работает как фильтр вывода

Преимущества pdoField над UltimateParent:

  • Более гибкая система параметров
  • Поддержка TV-параметров из коробки
  • Возможность указать fallback значения через &default и &output
  • Работа с любыми объектами через &class

Особенности производительности

PdoField максимально оптимизирован и выполняет только один запрос к базе данных. При использовании как фильтра вывода работает еще быстрее благодаря кешированию результатов.

Рекомендации по использованию:

  • Предпочитайте обычный вызов сниппета вместо фильтра для лучшей читаемости кода
  • Используйте &default вместо модификатора :default= для скорости
  • Кешируйте результаты в переменные на Fenom при многократном использовании
  • Избегайте избыточных вызовов для одного и того же поля
Оцените статью
MODX 3
Добавить комментарий

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.