Принудительное задание шаблона документу в момент создания

Думаю большинство помнит совсем недавнюю историю, где немного поспешив и не разобравшись до конца с вопросом мною был выложен пост, который в последствии был убран в черновики, до лучших времен. К этому посту шел компонент, который автоматически устанавливает имя шаблона при создании документа. Установка происходит в админке не в момент сохранения документа, а в момент его загрузки на редактирование. Как было верно замечено в прошлый раз, что во-первых таких компонентов полно, во-вторых все это можно реализовать стандартными средствами 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. Не знаю, восстановятся ли посты, после возвращения поста из черновиков, но я их хорошо помню. Это была конструктивная критика, которая сподвигла меня довести компонент до ума. И спасибо товарищу Уткину, за то, что ему приходится ковыряться в компонентах и давать ценные замечания :)
Кудашев Сергей
13 сентября 2018, 14:49
modx.pro
5
2 415
+5

Комментарии: 13

Наумов Алексей
13 сентября 2018, 14:57
0
Давно пользуюсь этим.
    Кудашев Сергей
    13 сентября 2018, 15:07
    0
    Спасибо за наводку, но Ваше решение меня не подойдет. Во-первых оно вынуждает создавать TV, что плодит лишние сущность. Во-вторых, оно не оформлено в пакет, что в общем не очень хорошо с точки зрения масштабируемости :)

    P.S. Алексей я никоим образом не придираюсь, но мне не понравилось ни одно из найденных решений, включая TemplateSelect, AutoTemplate, Inherit Template, а так же многочисленные безымянные решения на официальном форуме :) Именно поэтому реализовал свое видение решения данной проблемы.
    Павел Гвоздь
    13 сентября 2018, 17:24
    0
    А при чём тут эта картинка? Может я чего-то не понимаю…
      Кудашев Сергей
      13 сентября 2018, 17:32
      0
      Итак, суть проблемы в том, что при создании документа в каком-то родителе ему присваивается шаблон соседних документов. Но это не точно! © Big Russian Boss

      P.S. У самого были сомнения про эту картинку, но различное поведение указания шаблона при разных способах добавления документа просто не оставило мне шанса не пошутить подобным образом :)
        Илья Уткин
        14 сентября 2018, 08:12
        0
        Считается, что мем «Но это неточно» произошел от видеоблогера Биг Рашн Босса (Big Russian Boss). Но это неточно.

        Самое первое упоминание предложения в ироническом контексте — в 2015 году на сайте «Пикабу». Пользователь RZ25 опубликовал картинку с изображением голубя и воробья, поверх которой была надпись: «Воробьи — это дети голубей. Но это не точно».
        memepedia.ru/no-eto-ne-tochno/
        Здоров Александр
        14 сентября 2018, 06:19
        +1
        а я продолжу рекламировать дополнение Inherit Template, которое через TV задает какой шаблон ставить дочерним ресурсам.
          Кудашев Сергей
          14 сентября 2018, 08:42
          0
          Александр, как уже писал, лично мне не зашло ни одно из имеющихся решений, включая и Inherit Template. Но это дело вкуса :)

          Из всех имеющихся решений Inherit Template действительно одно из лучших с точки зрения удобства, назначил TV и забыл. С другой стороны, лишняя TV, плюс она доступна для редактирования в родителе (что уже порождает возможность тыкнуть в нее любопытному менеджеру, хотя ее можно и скрыть через доступ), плюс возможность работы только с одним уровнем вложенности и, насколько я понимаю MODX и логику компонента, сделать мультивложенность на TV прямым путем не получится.
          Семён Кудрявцев
          14 сентября 2018, 10:38
          +4
          Прочитал статью и у меня как будто дежавю).
          Вопрос уже неоднократно обсуждался и в сообществе и в канале телеграмма.
          Данная проблема решается встроенным функционалом самого 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
            Кудашев Сергей
            14 сентября 2018, 12:33
            0
            По первому пункту действительно ошибся. Спасибо, что указали на это :)
              Кудашев Сергей
              14 сентября 2018, 13:02
              0
              Уважаемый Sem, спасибо за исчерпывающий комментарий. По первому пункту действительно ошибся. По второму и третьему пунктам взял на вооружение. Хотя и знал про Настройку форм, но как-то не приходила в голову мысль убирать шаблоны.

              P.S. не просто признавать, что изобрел велосипед, но в данном случае так и есть :) Спасибо, что указали на это.
                Семён Кудрявцев
                14 сентября 2018, 13:09
                +1
                Сергей, я рад, что Вы правильно восприняли мой комментарий, я ни в коем случае не хотел сказать, что не надо делать подобных компонентов, просто раз уж этот функционал уже реализован в самом движке, то делать его дубль может быть и нет необходимости.
                По поводу настройки форм, я имел ввиду что там можно указать сразу нужный шаблон по умолчанию для определённого родителя, этот момент рассматривается в видео ближе к концу. Но идея вообще скрывать поле шаблона от менеджеров тоже неплохая мысль)
                Илья Уткин
                19 сентября 2018, 08:18
                0
                Насколько я понял, преимущество дополнения ForceTemplate в том, что его правила могут распространяться на определённую глубину. А настройками форм можно указать нужный шаблон только для прямых потомков.
                  Кудашев Сергей
                  19 сентября 2018, 09:07
                  +1
                  Да, это возможность указания глубины вложенности для определенного родителя. Так же он работает для «Быстро создать».
                Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
                13