Modx revo вывести заголовок родителя

Modx revo вывести заголовок родителя

Каждую неделю меня спрашивают: Как получить поля родителя в 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? &field=`myTV` &isTV=`1` &processTV=`1`]] аналогично вызову [[#1.tv.myTV]]

[[#1.properties.articles.articlesPerPage]] или [[#1.property.articles.articlesPerPage]] или даже [[#1.prop.articles.articlesPerPage]] (не поддерживается getResourceField)

[[!#get.name]] возвращает значение $_GET[‘name’]. Поддерживаются глобальные массивы: $_GET, $_POST, $_REQUEST, $_SERVER, $_FILES, $_COOKIE, $_SESSION. Тип массива после диеза (#) является чувствительным к регистру. Имя элемента массива также чувствительно к регистру. Вы можете использовать некешируемый тег [[!#get.name]] для кешируемых ресурсов.

fastField поддерживает фильтры вывода, например [[#3.pagetitle:ucase:default=`[[*pagetitle:ucase]]`]]

Ещё несколько примеров использования fastField

Выдаёт аннотацию родителя текущего ресурса и если она пуста, то выдаёт описание:

Возвращает содержимое ресурсов в чанке rowTpl во время использования Wayfinder:

Возвращает значение ТВ image из ресурса с ИД 10:

Возвращает значение $_POST[‘myVar’]:

3. Получение полей родителя через MODX API

Создаём сниппет с именем getThisField

Вызываем данный сниппет для получения оглавления:

Получение псевдонима у ресурса с ИД 123

Получение поля родителя через MODX API

Создаём сниппет и вставляем туда код для получения значения ТВ с именем myTVName для родителя ресурса с ИД = 123

Источники полезной информации:

Дмитрий

Спасибо за статью. Искал как получить ID «дедушки» . Ваша статья натолкнула на мысль.

Сниппет getDocFild — возвращает заданное поле документа по его ID
Входные параметры: id->ID документа для которого ищется значение поля; fild->искомое поле

Примеры вызова (. фигурные скобки <> заменить на квадратные []) :
<> Вернет Заголовок документа с/> <>` &fild=`pagetitle`>> Вернет Заголовок Родителя текущего документа

<>` &fild=`parent`>> Вернет ID Родителя->Родителя (дедушки) текущего документа

код сниппета getDocFild:

$resource = $modx->getObject(‘modResource’, $id);
$rez_fild = $resource->get($fild);
return $rez_fild;

Viktor Minator

Есть ещё дополнение UltimateParent. Может пригодится в этом случае

Дмитрий

есть, я в курсе. Но оно тяжелое. Зачем его «тягать», если можно сделать свое легенькое простенькое и к тому же заточенное под свою конкретную задачу.
Собственно этот маленький сниппетик просто демонстрация методов API и как с ними можно играть приложив чуточку фантазии 🙂

Дмитрий

Продолжая мысль:
Получить поля дедушек можно используя двойной вызов сниппета:

Дмитрий

Пример применения:
Есть товар, который лежит в 3-ем уровне — Отдел-Раздел-Подраздел.
Как на странице товара вывести ссылки на родителя и дедушку?
Знаю извращение, но не выдумывал бы, если бы не конкретный заказ, где пришлось это делать 🙂

Дмитрий

ой.. постирало все теги, бред получился 🙂
Это только админ может написать 🙂

Дмитрий

Но у меня не срабатывает 3 вариант с цифрой. Может опечатка какая-то? <<123:getThisField=`pagetitle`>>

Дмитрий Куликов

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

$parentIds = $modx->getParentIds(21);
$arrayIds = array_values($parentIds);
//Получаем предпоследний элемент массива
$lastId = count($arrayIds)-2;
echo $arrayIds[$lastId];

Источник

Спрашивали? Отвечаем Ответы на популярные вопросы по MODX Evolution

У всех, кто впервые сталкивается с MODx Evolution, очень часто возникают подобные вопросы: как вывести дату создания документа, как вывести автора документа, как вывести заголовок родителя и т.д. и т.п. Согласитесь, не для всех это может оказаться элементарным на первых шагах изучения MODx. А сколько было потрачено нервов и времени в бесплодных попытках найти нужный ответ! И не всегда даже найденный ответ бывает очевиден и понятен. Хватит! Настало время дать сразу все ответы на все вопросы. Ну в меру собственных сил и знаний, конечно. В этой статье я буду собирать все подобные вопросы и стараться дать максимально подробный ответ, конечно же все это будет сопровождаться готовыми рабочими примерами, которые каждый сможет применить на практике.

Автор не считает себя великим гуру, поэтому, в подготовке этой статьи рассчитывает на помощь читателей. Присылайте свои вопросы и найденные решения, комментируйте и предлагайте альтернативные подходы, критикуйте и становитесь соавторами этой подборки.

Сниппеты можно вызывать двумя способами:

Если вызов основного сниппета некэшируемый, то в шаблоне сниппет обязательно должен быть кэшируемым. Более того, чтобы избежать проблем с выводом сниппетов (например с постраничным разбиением), основной сниппет желательно всегда делать некэшируемым.

К примеру, имеем некэшируемый вызов Ditto:

у которого в шаблоне ditto_tpl надо вызвать сниппет Wayfinder:

Расширим задачу, сформулировав вопрос так: Как вообще выводить даты? Т.е. это может быть любая дата, как в шаблоне для Ditto так и на странице самого документа.

а) Задача: вывести дату создания документа в ленте новостей

Для вывода даты нам потребуется вставить в шаблон news_tpl в месте вывода этой даты специальный плэйсхолдер Ditto — [ +date+] – он выводит дату в установленном формате (которую мы зададим позже, при вызове Ditto). По умолчанию используется значение createdon (дата создания документа). Может принимать значения: editedon (дата последнего редактирования) и pub_date (дата публикации документа).

Создаем чанк news_tpl:

Для того, чтобы задать параметр из которого Ditto будет брать значение даты используем &dateSource=`editedon`. Для того чтобы задать формат даты, используем &dateFormat=`%d.%m.%Y`, где значением выступает любой валидный формат времени, который соответствует правилам функции PHP — strftime:

Символы для обозначения формата времени функции strftime

%a сокращенное название дня недели в текущей локали Ср
%A полное название дня недели в текущей локали 03.11.2021
%b сокращенное название месяца недели в текущей локали 03.11.2021
%B полное название месяца недели в текущей локали Ноябрь
%c предпочтительный формат даты и времени в текущей локали 03.11.2021
%C столетие (год, деленный на 100 и огругленный до целого, от 00 до 99) 03.11.2021
%d день месяца в виде десятичного числа (от 01 до 31) 03.11.2021
%D аналогично %m/%d/%y 03.11.2021
%e день месяца в виде десятичного числа, если это одна цифра, то перед ней добавляется пробел (от ‘ 1′ до ’31’) 03.11.2021
%g подобно %G, но без столетия. 03.11.2021
%G Год, 4-значное число, соответствующее номеру недели по ISO (см. %V). Аналогично %Y, за исключением того, что если номер недели по ISO соответствует предыдущему или следующему году, используется соответствующий год. 2021
%h аналогично %b ноя
%H номер часа от 00 до 23 03.11.2021
%I номер часа от 01 до 12 03.11.2021
%j номер дня в году (от 001 до 366) 307
%m номер месяца (от 01 до 12) 03.11.2021
%M минуты 03.11.2021
%n символ «\n» 03.11.2021
%p `am’ или `pm’, или соответствующие строки в текущей локали 03.11.2021
%r время в формате a.m. или p.m. 03.11.2021
%R время в 24-часовом формате 03.11.2021
%S секунды 03.11.2021
%t символ табуляции («\t») 03.11.2021
%T текущее время, аналогично %H:%M:%S 03.11.2021
%u номер дня недели от 1 до 7, где 1 соответствует понедельнику 03.11.2021
%U порядковый номер недели в текущем году. Первым днем первой недели в году считается первое воскресенье года. 03.11.2021
%V Порядковый номер недели в году по стандарту ISO 8601:1988 от 01 до 53, где 1 соответствует первой неделе в году, в которой как минимум 4 дня принадлежат этому году. Первым днем недели считается понедельник. (Используйте %G or %g для определения соответствующего года) 44
%W порядковый номер недели в текущем году. Первым днем первой недели в году считается первый понедельник года. 03.11.2021
%w номер дня недели, 0 соответствует воскресенью 03.11.2021
%x предпочтительный формат даты без времени в текущей локали 03.11.2021
%X предпочтительный формат времени без даты в текущей локали 03.11.2021
%y год без столетия (от 00 до 99) 03.11.2021
%Y год, включая столетие 03.11.2021
%Z временная зона в виде смещения, аббривеатуры или полного наименования 03.11.2021
%% символ `%’ 03.11.2021

Примеры вызова Ditto с разными значениями даты:

б) Задача: вывести дату на странице самой новости

Казалось бы, чего проще? Меняем в чанке news_tpl все + на * и нужный чанк готов. Но в MODx нет специального тега [ *date*], поэтому, вместо него придется использовать [ *createdon*], [ *editedon*] или [ *pub_date*].

Для начала пробуем [ *createdon*] или [ *editedon*] и получаем вместо даты что-то типа этого:

Почему же так получилось? Потому что, любое время в БД записывается в виде Unix Timestamp — количество секунд от 1 января 1970 года до текущего момента. Зачем же такое придумали? Ну, например, для того, чтобы была возможность оперировать датой в независимости от ее формата. На самом деле, это будет легко перевести в нужный нам формат, но об этом чуть позже.

Берем следующий параметр [ *pub_date*] и получаем:

Ну а тут то что не так, спросите вы? Оказывается, по-умолчанию параметр pub_date не устанавливается, поэтому его значение равно 0 и попытка его вывести выдаст 0 или 01.01.1970. Чтобы избежать этого, придется параметр pub_date делать обязательным к заполнению или установить ему значение по умолчанию. В этом нам поможет ManagerManager. Но даже если параметр будет заполнен, на выходе мы вновь увидим количество секунд, прошедших с 01.01.1970.

Решение 1. На помощь придет PHx, только прежде чем его устанавливать, ознакомьтесь с возможными проблемами. При установленном PHx вывод даты можно сделать таким образом:

Кстати, PHx можно использовать и в шаблоне Ditto, вставив вместо плэйсхолдера [ +date+] один из этих плэйсхолдеров:

В этом слачае, при вызове Ditto параметры &dateSource и &dateFormat не нужны.

Решение 2. Для вывода даты в нужном формате можно воспользоваться сниппетом. Создаем новый сниппет, назовем его, к примеру, DateFormat, и помещаем в него следующий код:

В том месте, где нам необходимо вывести дату, помещаем такой вызов этого сниппета:

В параметре &val мы задаем значение для даты, а в параметре &format нужный формат. Сниппет может применяться как на странице новости, так и в шаблоне для Dito, не забудьте, если Ditto вызывается некэшируемым, то в его шаблоне сниппет должен вызываться как кэшируемый.

Если вызвать сниппет вообще без параметров:

то он выведет текущую дату в формате заданном по умолчанию: «%d.%m.%Y», этот формат можно поменять в коде сниппета.

Источник

Читайте также:  Как чистят аэродромы от снега
Оцените статью