Получение полей родителя MODX
Каждую неделю меня спрашивают: Как получить поля родителя в MODX Revolution. Есть несколько способов, давайте рассмотрим несколько приёмов.
1. Сниппет getResourceField
устанавливаем из репозитория
минимальный вызов: [[getResourceField]]
Параметры сниппета getResourceField
Название |
Описание |
По-умолчанию |
---|---|---|
id |
ИД ресурса для получения поля. |
$modx->resource->get('id') |
field |
Поле или ТВ, которое нужно получить. |
pagetitle |
isTV |
Когда значение 1 или true, то подразумевается, что поле - это ТВ. |
false |
processTV |
Когда значение 1 или true, то ТВ будет обработана согласно настройкам вывода. |
false |
default |
Значение (строка) будет возвращена, если поле не найдено или пусто. |
2. Плагин fastField
- устанавливаем из репозитория
- синтаксис вызова [[#resource_id.field]], где resource_id - ИД ресурса, field - название поля
Примеры использования плагина fastField
[[#1.pagetitle]] - поля ресурсов
[[#1.tv.myTV]] обработанные ТВ
[[#1.properties.articles.articlesPerPage]] параметры ресурса
[[#POST.name]] значение $_POST['name'] (и других глобальных ресурсов аналогично сниппету getReqParam)
[[getResourceField? id=`1` &field=`myTV` &isTV=`1` &processTV=`1`]] аналогично вызову [[#1.tv.myTV]]
[[#1.properties.articles.articlesPerPage]] или [[#1.property.articles.articlesPerPage]] или даже [[#1.prop.articles.articlesPerPage]] (не поддерживается getResourceField)
Стандартным является использование Пространства имён "core".
[[!#get.name]] возвращает значение $_GET['name']. Поддерживаются глобальные массивы: $_GET, $_POST, $_REQUEST, $_SERVER, $_FILES, $_COOKIE, $_SESSION. Тип массива после диеза (#) является чувствительным к регистру. Имя элемента массива также чувствительно к регистру. Вы можете использовать некешируемый тег [[!#get.name]] для кешируемых ресурсов.
fastField поддерживает фильтры вывода, например [[#3.pagetitle:ucase:default=`[[*pagetitle:ucase]]`]]
Ещё несколько примеров использования fastField
Выдаёт аннотацию родителя текущего ресурса и если она пуста, то выдаёт описание:
[[#[[*parent]].introtext:default=`[[#[[*parent]].description]]`]]
Возвращает содержимое ресурсов в чанке rowTpl во время использования Wayfinder:
[[#[[+wf.docid]].content]]
Возвращает значение ТВ image из ресурса с ИД 10:
[[#10.tv.image]]
Возвращает значение $_POST['myVar']:
[[!#post.myVar]]
3. Получение полей родителя через MODX API
Создаём сниппет с именем getThisField
$parent = $modx->getObject('modResource',$input); $field = $parent ->get($options); return $field;
Вызываем данный сниппет для получения оглавления:
[[*parent:getThisField=`pagetitle`]]
Получение псевдонима у ресурса с ИД 123
[[123:getThisField=`alias`]]
Получение поля родителя через MODX API
Создаём сниппет и вставляем туда код для получения значения ТВ с именем myTVName
для родителя ресурса с ИД = 123
$product = $modx->getObject('modResource',123);
$parent = $product->getOne('Parent');
$myTVValue = $parent->getTVValue('myTVName');
Источники полезной информации:
30-12-2014 MODx API перевод документации Виктор Матушевский
Дмитрий
29.08.2013 10:00Спасибо за статью. Искал как получить ID "дедушки" . Ваша статья натолкнула на мысль.
Сниппет getDocFild - возвращает заданное поле документа по его ID
Входные параметры: id->ID документа для которого ищется значение поля; fild->искомое поле
Примеры вызова (!!! фигурные скобки {} заменить на квадратные []) :
{{!getDocFild? &id=`10` &fild=`pagetitle`}} Вернет Заголовок документа с ID=10
{{!getDocFild? &id=`{{*parent}}` &fild=`pagetitle`}} Вернет Заголовок Родителя текущего документа
{{!getDocFild? &id=`{{*parent}}` &fild=`parent`}} Вернет ID Родителя->Родителя (дедушки) текущего документа
код сниппета getDocFild:
$resource = $modx->getObject('modResource', $id);
$rez_fild = $resource->get($fild);
return $rez_fild;
Viktor Minator
29.08.2013 12:13Есть ещё дополнение UltimateParent. Может пригодится в этом случае
Дмитрий
29.08.2013 13:44есть, я в курсе. Но оно тяжелое. Зачем его "тягать", если можно сделать свое легенькое простенькое и к тому же заточенное под свою конкретную задачу.
Собственно этот маленький сниппетик просто демонстрация методов API и как с ними можно играть приложив чуточку фантазии :)
Дмитрий
29.08.2013 10:04Продолжая мысль:
Получить поля дедушек можно используя двойной вызов сниппета:
{{!getDocFild? &id=`{{getDocFild? &id=`{{*parent}}` &fild=`parent`}}` &fild=`pagetitle`}}
Дмитрий
29.08.2013 13:49Пример применения:
Есть товар, который лежит в 3-ем уровне - Отдел-Раздел-Подраздел.
Как на странице товара вывести ссылки на родителя и дедушку?
Знаю извращение, но не выдумывал бы, если бы не конкретный заказ, где пришлось это делать :)
Родитель-{{getDocFild? &id=`{{getDocFild? &id=`{{getDocFild? &id=`{{*parent}}` &fild=`parent`}}` &fild=`parent`}}` &fild=`menutitle`}}
Дедушка-{{getDocFild? &id=`{{getDocFild? &id=`{{*parent}}` &fild=`parent`}}` &fild=`menutitle`}}
Дмитрий
29.08.2013 13:51ой.. постирало все теги, бред получился :)
Это только админ может написать :)
Дмитрий
22.09.2013 06:14Полезная статья.
Но у меня не срабатывает 3 вариант с цифрой. Может опечатка какая-то? {{123:getThisField=`pagetitle`}}
Дмитрий Куликов
06.03.2014 19:39Получить предпоследний родитель документа:
$parentIds = $modx->getParentIds(21);
$arrayIds = array_values($parentIds);
//Получаем предпоследний элемент массива
$lastId = count($arrayIds)-2;
echo $arrayIds[$lastId];
Олег Журавлев
15.05.2014 06:18Хероям сала!
Viktor Matushevskyi
15.05.2014 09:21Вы на сегодня не забыли принять лекарства?