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

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

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

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

1. Как вызвать сниппет в шаблоне другого сниппета?

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

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

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

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

2. Как вывести дату создания документа?

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

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

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

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

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

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

Примеры вызова 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", этот формат можно поменять в коде сниппета.

📎📎📎📎📎📎📎📎📎📎