Сниппет pdoField предназначен для быстрой выборки любого поля указанного ресурса или его родителя, включая TV-параметры. Он объединяет возможности устаревших сниппетов getResourceField и UltimateParent, позволяя получать данные из документов любых контекстов с гибкой настройкой условий выборки. Основное применение — вывод полей родительских ресурсов, работа с иерархией документов и получение данных любых объектов MODX через параметр &class.
Уникальная особенность pdoField — возможность вызова как обычного сниппета и как фильтра вывода, что делает его чрезвычайно гибким инструментом. Сниппет поддерживает дополнительные параметры выборки, позволяя, например, не выводить поля скрытых или удаленных ресурсов.
- Базовый синтаксис использования
- Параметры
- Вызов как фильтр вывода
- Работа с иерархией ресурсов
- Параметр &top — подъем вверх
- Параметр &topLevel — уровень от корня
- Работа с TV-параметрами
- Использование параметров default и output
- Параметр &default
- Параметр &output
- Работа с разными классами объектов
- Фильтрация скрытых ресурсов
- Работа в разных контекстах
- Практические примеры использования
- Вывод заголовка раздела в хлебных крошках
- Баннер категории из родителя
- Информация об авторе статьи
- SEO описание из иерархии
- Логотип из главной страницы контекста
- Вызов через Fenom
- Комбинация с другими сниппетами
- Использование в pdoResources
- Условный вывод с 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 при многократном использовании
- Избегайте избыточных вызовов для одного и того же поля






