MODX. Получение полей родительских, прародительских и прочих ресурсов

В процессе создания сайтов достаточно часто появляется необходимость вычислять поля родительских ресурсов, а также ресурсов дедушек, прадедушек и прочих соседей. Рассмотрим разные методы вычисления подобных данных.

Прежде всего, стоит учитывать что у каждого ресурса в MODX есть поле parent, доступ к которому можно получить с помощью соответствующего плейсхолдера:

[[*parent]]

Если помимо id родительского ресурса необходимо выудить какое-либо его поле, можно воспользоваться возможностью компонента fastField (начиная с какой-то лохматой версии включен в пакет pdoTools. Если вы используете инструменты этого пакета, сам fastField устанавливать нет необходимости).

[[#[[*parent]].pagetitle]]

Вместо плейсхолдера parent можно поставить любой другой id или условие для расчета id, и получить соответствующие поля дочерних, сестринских и прочих ресурсов.

<!-- ID дедушки -->
[[#[[*parent:parent]].pagetitle]]

<!-- просто id -->
[[#23.pagetitle]]

<!-- id из GET параметра -->
[[#[[#GET.key]].pagetitle]]

Помимо этого, для получения полей родительского ресурса, можно воспользоваться сниппетами: getResourceField, UltimateParent, pdoField. Из этого списка лучше всего использовать сниппет pdoField (идет в комплекте с pdoTools), т.к. он быстрее и функциональнее:

[[pdofield? 
      &top=`2` 
      &field=`pagetitle`
]]

Для получения дедушки или прадедушки проще всего использовать сниппет pdoField:

[[pdofield? 
      &top=`3` 
      &field=`pagetitle`
]]

Для получения данных о первом подкаталоге в цепочке также можно использовать сниппет pdoField:

[[pdofield? 
      &topLevel=`1` 
      &field=`pagetitle`
      &ultimate=`1`
]]

Для получения родительских элементов в сниппетах и плагинах можно использовать возможности xPDO:

// с помощью getParentIds можно получить только id родительских документов соответствующих указанным параметрам
$parentIds = $modx->getParentIds(id документа, уровень вложенности, указание контекста);

// если необходимо получение полей, можно использовать универсальный getObject
$parentId = $modx->getObject('modResource', id документа);
$field = $parentId->get('pagetitle');

// если необходимо получить дополнительное поле (TV)
$tvValue = $parentId->getTVValue('tvName');