Принудительное задание шаблона документу в момент создания
Думаю большинство помнит совсем недавнюю историю, где немного поспешив и не разобравшись до конца с вопросом мною был выложен пост, который в последствии был убран в черновики, до лучших времен. К этому посту шел компонент, который автоматически устанавливает имя шаблона при создании документа. Установка происходит в админке не в момент сохранения документа, а в момент его загрузки на редактирование. Как было верно замечено в прошлый раз, что во-первых таких компонентов полно, во-вторых все это можно реализовать стандартными средствами 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
Давно пользуюсь этим.
Спасибо за наводку, но Ваше решение меня не подойдет. Во-первых оно вынуждает создавать TV, что плодит лишние сущность. Во-вторых, оно не оформлено в пакет, что в общем не очень хорошо с точки зрения масштабируемости :)
P.S. Алексей я никоим образом не придираюсь, но мне не понравилось ни одно из найденных решений, включая TemplateSelect, AutoTemplate, Inherit Template, а так же многочисленные безымянные решения на официальном форуме :) Именно поэтому реализовал свое видение решения данной проблемы.
P.S. Алексей я никоим образом не придираюсь, но мне не понравилось ни одно из найденных решений, включая TemplateSelect, AutoTemplate, Inherit Template, а так же многочисленные безымянные решения на официальном форуме :) Именно поэтому реализовал свое видение решения данной проблемы.
А при чём тут эта картинка? Может я чего-то не понимаю…
Итак, суть проблемы в том, что при создании документа в каком-то родителе ему присваивается шаблон соседних документов. Но это не точно! © Big Russian Boss
P.S. У самого были сомнения про эту картинку, но различное поведение указания шаблона при разных способах добавления документа просто не оставило мне шанса не пошутить подобным образом :)
P.S. У самого были сомнения про эту картинку, но различное поведение указания шаблона при разных способах добавления документа просто не оставило мне шанса не пошутить подобным образом :)
Считается, что мем «Но это неточно» произошел от видеоблогера Биг Рашн Босса (Big Russian Boss). Но это неточно.memepedia.ru/no-eto-ne-tochno/
Самое первое упоминание предложения в ироническом контексте — в 2015 году на сайте «Пикабу». Пользователь RZ25 опубликовал картинку с изображением голубя и воробья, поверх которой была надпись: «Воробьи — это дети голубей. Но это не точно».
а я продолжу рекламировать дополнение Inherit Template, которое через TV задает какой шаблон ставить дочерним ресурсам.
Александр, как уже писал, лично мне не зашло ни одно из имеющихся решений, включая и Inherit Template. Но это дело вкуса :)
Из всех имеющихся решений Inherit Template действительно одно из лучших с точки зрения удобства, назначил TV и забыл. С другой стороны, лишняя TV, плюс она доступна для редактирования в родителе (что уже порождает возможность тыкнуть в нее любопытному менеджеру, хотя ее можно и скрыть через доступ), плюс возможность работы только с одним уровнем вложенности и, насколько я понимаю MODX и логику компонента, сделать мультивложенность на TV прямым путем не получится.
Из всех имеющихся решений 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
Вопрос уже неоднократно обсуждался и в сообществе и в канале телеграмма.
Данная проблема решается встроенным функционалом самого 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
По первому пункту действительно ошибся. Спасибо, что указали на это :)
Уважаемый Sem, спасибо за исчерпывающий комментарий. По первому пункту действительно ошибся. По второму и третьему пунктам взял на вооружение. Хотя и знал про Настройку форм, но как-то не приходила в голову мысль убирать шаблоны.
P.S. не просто признавать, что изобрел велосипед, но в данном случае так и есть :) Спасибо, что указали на это.
P.S. не просто признавать, что изобрел велосипед, но в данном случае так и есть :) Спасибо, что указали на это.
Сергей, я рад, что Вы правильно восприняли мой комментарий, я ни в коем случае не хотел сказать, что не надо делать подобных компонентов, просто раз уж этот функционал уже реализован в самом движке, то делать его дубль может быть и нет необходимости.
По поводу настройки форм, я имел ввиду что там можно указать сразу нужный шаблон по умолчанию для определённого родителя, этот момент рассматривается в видео ближе к концу. Но идея вообще скрывать поле шаблона от менеджеров тоже неплохая мысль)
По поводу настройки форм, я имел ввиду что там можно указать сразу нужный шаблон по умолчанию для определённого родителя, этот момент рассматривается в видео ближе к концу. Но идея вообще скрывать поле шаблона от менеджеров тоже неплохая мысль)
Насколько я понял, преимущество дополнения ForceTemplate в том, что его правила могут распространяться на определённую глубину. А настройками форм можно указать нужный шаблон только для прямых потомков.
Да, это возможность указания глубины вложенности для определенного родителя. Так же он работает для «Быстро создать».
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.