MODX. Получение полей родительских, прародительских и прочих ресурсов
Отредактировано: 02 Декабря 2019
В процессе создания сайтов достаточно часто появляется необходимость вычислять поля родительских ресурсов, а также ресурсов дедушек, прадедушек и прочих соседей. Рассмотрим разные методы вычисления подобных данных.
Прежде всего, стоит учитывать что у каждого ресурса в 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');