- Modx revo вывести заголовок родителя
- 1. Сниппет getResourceField
- Параметры сниппета getResourceField
- 2. Плагин fastField
- Примеры использования плагина fastField
- Ещё несколько примеров использования fastField
- 3. Получение полей родителя через MODX API
- Получение поля родителя через MODX API
- Спрашивали? Отвечаем Ответы на популярные вопросы по MODX Evolution
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:
%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», этот формат можно поменять в коде сниппета.
Источник