Принудительное задание шаблона документу в момент создания
Думаю большинство помнит совсем недавнюю историю, где немного поспешив и не разобравшись до конца с вопросом мною был выложен пост, который в последствии был убран в черновики, до лучших времен. К этому посту шел компонент, который автоматически устанавливает имя шаблона при создании документа. Установка происходит в админке не в момент сохранения документа, а в момент его загрузки на редактирование. Как было верно замечено в прошлый раз, что во-первых таких компонентов полно, во-вторых все это можно реализовать стандартными средствами MODX. Однако помедитировав немного над предложенными решениями все таки решил допилить компонент до желаемого функционала и поделиться с общественностью.

Итак, суть проблемы была в том, что при создании документа в каком-то родителе ему присваивается шаблон родительского документа (до этого я указывал, что соседних документов, но это было ошибочно). При создании нового документа через «Быстрое создание» ему будет назначен шаблон указанный в системных настройках, как шаблон по умолчанию. На проектах, где несколько контент-менеджеров проблемы с назначением неверных шаблонов происходят постоянно. Самое неприятное, что контент-менеджеры не всегда визуально проверяют результаты размещения контента на сайт и проблемы с шаблонами всплывают только через какое-то время. Самым разумным из предложенных решений, было совсем скрыть возможность выбора шаблона, но в моем случае это оказалось невозможно из-за ряда требований на проекте. В общем идея сокрытия возможности назначения шаблона была отметена заказчиком.
Решить данную проблему призван компонент ForceTemplate, который состоит из плагина, позволяющего установить фиксированный шаблон при создании документов внутри определенного родителя и его потомков, если используется многоуровневость. Делается это следующим образом. После установки компонента необходимо заполнить опцию rules (Правила), находящуюся в неймспейсе компонента. Формат данной опции это последовательность правил «parent_id:template:level» разделенные символом пайп (|) или двойным пайп (||). Например, нам нужно задать два правила: Есть родитель с id 3 с 1-м уровнем вложенности и шаблоном с id 1, для него необходимо прописать прописываем 3:1. Есть родитель с id 4 с желаемым уровнем вложенности 5 и шаблоном «my template» (смотреть id нам лениво) то необходимо задать: 4:my template:5. Для объединения этих правил и использования их вместе объединяем их через пайп (|) или двойной пайп (||).
Плагин использует системное событие «OnDocFormRender» и срабатывает только для вновь создаваемых документов. Так же он использует событие «OnManagerPageBeforeRender», для того, чтобы внедрить JS код, который позволяет работать с меню «Быстро создать». Таким образом теперь полноценно реализована работа как при простом создании документов, так для меню «Быстро создать». Найденный по правилам шаблон устанавливается в поле Template редактируемой страницы, что дает нам определенную гибкость. При желании мы можем поменять перед сохранением.
Про другие особенности особенно распространяться не буду, они все указаны в аннотациях как в репозиториях, так и на гитхабе. Единственное что добавлю, что компонент и его философия работы (установил, настроил и забыл) подходит лично мне. Я не сомневаюсь, что есть другие решения, возможно лучшие, но аналогичного возможностью задавать группам документов по паттернам через многоуровневость нет.
Компонент доступен на github. Если будут предложения или пожелания по работе компонента, предлагаем :)
P.S. Выражаю огромную благодарность всем, кто критиковал предыдущую версию поста, особенно товарищ Sem. Не знаю, восстановятся ли посты, после возвращения поста из черновиков, но я их хорошо помню. Это была конструктивная критика, которая сподвигла меня довести компонент до ума. И спасибо товарищу Уткину, за то, что ему приходится ковыряться в компонентах и давать ценные замечания :)

Итак, суть проблемы была в том, что при создании документа в каком-то родителе ему присваивается шаблон родительского документа (до этого я указывал, что соседних документов, но это было ошибочно). При создании нового документа через «Быстрое создание» ему будет назначен шаблон указанный в системных настройках, как шаблон по умолчанию. На проектах, где несколько контент-менеджеров проблемы с назначением неверных шаблонов происходят постоянно. Самое неприятное, что контент-менеджеры не всегда визуально проверяют результаты размещения контента на сайт и проблемы с шаблонами всплывают только через какое-то время. Самым разумным из предложенных решений, было совсем скрыть возможность выбора шаблона, но в моем случае это оказалось невозможно из-за ряда требований на проекте. В общем идея сокрытия возможности назначения шаблона была отметена заказчиком.
Решить данную проблему призван компонент ForceTemplate, который состоит из плагина, позволяющего установить фиксированный шаблон при создании документов внутри определенного родителя и его потомков, если используется многоуровневость. Делается это следующим образом. После установки компонента необходимо заполнить опцию rules (Правила), находящуюся в неймспейсе компонента. Формат данной опции это последовательность правил «parent_id:template:level» разделенные символом пайп (|) или двойным пайп (||). Например, нам нужно задать два правила: Есть родитель с id 3 с 1-м уровнем вложенности и шаблоном с id 1, для него необходимо прописать прописываем 3:1. Есть родитель с id 4 с желаемым уровнем вложенности 5 и шаблоном «my template» (смотреть id нам лениво) то необходимо задать: 4:my template:5. Для объединения этих правил и использования их вместе объединяем их через пайп (|) или двойной пайп (||).
Плагин использует системное событие «OnDocFormRender» и срабатывает только для вновь создаваемых документов. Так же он использует событие «OnManagerPageBeforeRender», для того, чтобы внедрить JS код, который позволяет работать с меню «Быстро создать». Таким образом теперь полноценно реализована работа как при простом создании документов, так для меню «Быстро создать». Найденный по правилам шаблон устанавливается в поле Template редактируемой страницы, что дает нам определенную гибкость. При желании мы можем поменять перед сохранением.
Про другие особенности особенно распространяться не буду, они все указаны в аннотациях как в репозиториях, так и на гитхабе. Единственное что добавлю, что компонент и его философия работы (установил, настроил и забыл) подходит лично мне. Я не сомневаюсь, что есть другие решения, возможно лучшие, но аналогичного возможностью задавать группам документов по паттернам через многоуровневость нет.
Компонент доступен на github. Если будут предложения или пожелания по работе компонента, предлагаем :)
P.S. Выражаю огромную благодарность всем, кто критиковал предыдущую версию поста, особенно товарищ Sem. Не знаю, восстановятся ли посты, после возвращения поста из черновиков, но я их хорошо помню. Это была конструктивная критика, которая сподвигла меня довести компонент до ума. И спасибо товарищу Уткину, за то, что ему приходится ковыряться в компонентах и давать ценные замечания :)
Комментарии: 13
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
P.S. Алексей я никоим образом не придираюсь, но мне не понравилось ни одно из найденных решений, включая TemplateSelect, AutoTemplate, Inherit Template, а так же многочисленные безымянные решения на официальном форуме :) Именно поэтому реализовал свое видение решения данной проблемы.
P.S. У самого были сомнения про эту картинку, но различное поведение указания шаблона при разных способах добавления документа просто не оставило мне шанса не пошутить подобным образом :)
Из всех имеющихся решений Inherit Template действительно одно из лучших с точки зрения удобства, назначил TV и забыл. С другой стороны, лишняя TV, плюс она доступна для редактирования в родителе (что уже порождает возможность тыкнуть в нее любопытному менеджеру, хотя ее можно и скрыть через доступ), плюс возможность работы только с одним уровнем вложенности и, насколько я понимаю MODX и логику компонента, сделать мультивложенность на TV прямым путем не получится.
Вопрос уже неоднократно обсуждался и в сообществе и в канале телеграмма.
Данная проблема решается встроенным функционалом самого MODX (Раздел — Настройка форм), без каких либо компонентов, плагинов и.т.д.
Сначала о Вашей проблеме:
1)Шаблон дочерних ресурсов при обычном создании всегда наследуется от родителя, а не от соседних ресурсов.
2)При быстром создании этого наследования нет, но и само быстрое создание ресурсов доставляет больше проблем контент-менеджерам, так как там не выводятся TV-поля для заполнения, а ресурсы редко бывают абсолютно чистыми (только с родными полями), поэтому в политиках доступа всем менеджерам просто отключается возможность быстро создавать и обновлять ресурсы (resource_quick_create и resource_quick_update)
3)После изучения раздела «Настройка форм» штатными средствами MODX можно очень гибко настраивать шаблон для дочерних ресурсов в зависимости от родителя. Вот скриншот как выглядят правила назначения шаблона для дочерних ресурсов у родителя с id = 2
yadi.sk/i/jpFt5JpyBnUckg
yadi.sk/i/rQKpAEbsVFVgPA
P.S. У меня много проектов, где «контентщики» пишут статьи и пока не разу не возникала проблема с назначением шаблона.
P.S Полезный урок от Артёма по настройке форм — www.youtube.com/watch?v=G7N-Ku5GpsI
P.S. не просто признавать, что изобрел велосипед, но в данном случае так и есть :) Спасибо, что указали на это.
По поводу настройки форм, я имел ввиду что там можно указать сразу нужный шаблон по умолчанию для определённого родителя, этот момент рассматривается в видео ближе к концу. Но идея вообще скрывать поле шаблона от менеджеров тоже неплохая мысль)