1

Тема: Нужен бандл/библиотека для редактирования twig-шаблонов в браузере

Здравствуйте, коллеги!

Я ищу решение для возможности редактирования twig-шаблонов через web интерфейс. То есть у меня есть папка с шаблонами, app/Resources/views/Emails. И мне необходимо предоставить менеджеру возможность редактирования шаблонов находящихся в этих папках прямо из админки проекта. Шаблонов много, они на разных языках, поэтому править шаблоны в режиме постановки отдельных задач накладно по времени.

Что собственно ищу: в идеале готовое решение в виде бандла default/smile  То есть отображать файловую структуру папки, а также возможность редактирования шаблонов с подсветкой.

Такого пока не нашёл) Поэтому думаю выбрать файловый менеджер и WISYWIG-редактор. Требования к красивости минимальны. Главное - чтобы можно было быстро поставить и использовать.


О текущей реализации:

На данный момент я храню эти шаблоны в базе. Кроме того в админке есть возможность запустить специально написанные тесты для уведомлений с выводом результата на всех языках. То есть менеджер правит шаблон и тут же может посмотреть в каком виде письмо придёт пользователю. Так же в результатах тестов пишется отладочная информация - названия использованных шаблонов, используемые в шаблоне переменные.

Все эти правки делаются конечно не в продуктовой среде а на тестовом сервере. И после того как менеджер поправит шаблоны он нажимает кнопку Сохранить. При этом создаётся csv-дамп. Который я уже дальше оформляю в пулл-реквест.

Проблем с хранением шаблонов в базе:

Шаблоны стали усложняться, устраняя дублирование наплодилось много вспомогательных шаблонов, абстракций. И всё это довольно сложно для правки. И всё было бы гораздо проще, хранись эти шаблоны в файловой системе. Можно было бы разбить всё по папкам, да и программерам было бы работать проще с файлами в своей IDE чем через веб-морду. Да и сам пулл-реквест о правках в шаблонах неудобен - diff-csv файлов. Еще и надо это дело мигрировать на прод базу... Короче лоханулся я, надо было сразу писать шаблоны в файловой системе и просто реализовать интерфейс для редактирования.


PS Может кому-то будет интересна/полезна такая реализация. Если интересно расскажу подробней о реализации механизма отправки уведомлений. Или если кто поделится своей реализацией, тоже было бы здорово. Проблема email-уведомлений общего характера, но я не встречал в сети каких-либо общепринятых приёмов её решения, примеров реализации

2

Re: Нужен бандл/библиотека для редактирования twig-шаблонов в браузере

Не вижу проблемы в хранении шаблонов в базе в контексте задачи. БД функциональнее, можно параллельно хранить кучу мета-информации, добавлять опции и т.д. С файлами такого не провернешь.

Но процесс «тестовый сервер — дамп в csv — пулл реквест» мне лично непонятен. Есть какие-то специфические требования, требующие такой замороченной реализации? Попробуйте описать эту часть, и зачем она. На мой взгляд, этот процесс вообще можно сделать автоматическим, и без всяких csv.

С вменяемыми визивигами и файл-менеджерами под веб вряд ли помогу — в основном все что мне доводилось видеть — унылое говно, часто еще и дырявое. И, я все же не уверен, что именно визивиг в данном случае — подходящий вариант. Но тут уже нужно смотреть, какие есть возможности у менеджеров (т.е. обладают ли они хотя бы базовыми знаниями html/twig разметки или все совсем плохо).

3

Re: Нужен бандл/библиотека для редактирования twig-шаблонов в браузере

Не вижу проблемы в хранении шаблонов в базе в контексте задачи. БД функциональнее, можно параллельно хранить кучу мета-информации, добавлять опции и т.д. С файлами такого не провернешь.

Просто не удобно работать с этими шаблонами через БД. Во первых нет иерархической структуры, не разбить всё по папкам. Частично проблему иерархичности решает именование. Но с ростом количества уведомлений это плохо воспринимается. Во вторых редактировать html.twig шаблоны в простом текстовом поле неудобно, ни подсветки, ни форматирования, ни возможностей IDE. К тому же активно используется наследование, include конструкции, и даже уже подключаются шаблоны из файловой системы (фрагменты используемые на страницах проекта).

Сегодня ещё осознал что придётся выносить все переводы из шаблонов в стандартный механизм переводов (в yml-файлы). А то приходится всю верстку с содержимым текстом дублировать для каждого языка. Тут ещё задача подходит добавить новый язык. И вот тут ещё проблема как отдать шаблоны в том виде как они есть на перевод переводчику. Про переводы вообще отдельная тема...

Мета информацию можно хранить в twig-комментах. А по поводу опций... Их можно реализовать в другом месте. Сейчас для каждого уведомления есть свой класс (subscriber) в котором указывается передаваемые в шаблон переменные, используемый шаблон и некоторые опции. А потом этот subscriber передаётся целиком в сервис по отправке уведомлений. Каких то динамических опций который были именно частью шаблона я пока не предвижу... может что-то упускаю.

Но процесс «тестовый сервер — дамп в csv — пулл реквест» мне лично непонятен

Сам не уверен в этом решении, действительно заморочено. Суть такая. Почему тестовый сервер: на проде править не вариант, запросто можно накосячить. То есть правки в шаблонах должны проходить code review. Проверки синтаксиса шаблона не достаточно. И тесты запускать на проде тоже не вариант.  Тесты запускаются просто командой exec('phpunit...').

Итак, менеджер говорит мне - "Я буд править email шаблоны". Правит. Нажимает сохранить дамп. Когда он закончит - я забираю этот дамп. Это фикстурные данные по сути. Я создаю миграцию, в которой очищается таблица шаблонов и заполняется из нового дампа. Далее делаю реквест, он билдится, тестится, ревьвится и мёрджится в master-ветку.

Но теперь... когда текст уведомлений я решил вынести в файлы переводов, возможность правки самих шаблонов через амдинку теряет свою актуальность. Важнее дать возможность редактировать файлы переводов... тут тоже неясно как это сделать. Юзал раньше веб морду из бандла jms/translation-bundle... но он сцуко, перекалбашивает весь файл после правок. Вот думаю на xliff перейти и найти какую-то тулзу для работы с ним, можно настольную.


С вменяемыми визивигами и файл-менеджерами под веб вряд ли помогу — в основном все что мне доводилось видеть — унылое говно, часто еще и дырявое

Сложилось точно такое же впечатление, надеялся что оно ошибочное default/smile

Вот интерфейс подписчика:

/**
 * Interface for creating email notification subscribers
 */
interface NotificationSubscriberInterface
{
    /**
     * @return boolean true - this subscriber going to work and email will sends, false - email will not be sent
     */
    public function condition();

    /**
     * @return string Subject template name
     */
    public function getSubject();

    /**
     * @return string Message body template name
     */
    public function getBody();

    /**
     * @return string Sender template name (used in From and Reply-To headers)
     */
    public function getSenderName();

    /**
     * @return string Email used in Reply-To header
     */
    public function getReplyToEmail();

    /**
     * @return array|ArrayCollection of User entities to who send message
     */
    public function getRecipients();

    /**
     * @return array Hash of parameters passed to each template fragment
     */
    public function getTemplateParameters();

    /**
     * @return boolean Whether exclude (true) the current authenticated user from recipients
     */
    public function notSendToOriginator();

    /**
     * @return string mime type of email content
     */
    public function getContentType();
}

4

Re: Нужен бандл/библиотека для редактирования twig-шаблонов в браузере

brizzz пишет:

Во первых нет иерархической структуры

Ну, это в той же БД реализуется на ура, добавляете дерево и получаете копию иерархии в ФС. default/smile

brizzz пишет:

редактировать html.twig шаблоны в простом текстовом поле неудобно, ни подсветки, ни форматирования, ни возможностей IDE. К тому же активно используется наследование, include конструкции, и даже уже подключаются шаблоны из файловой системы

Тут только самому писать, видимо, надстройку на JS, чтобы подсвечивала и через макросы нужные конструкции добавляла. У меня похожим образом форматирование публикаций в проекте работает (размещение элементов и линковка через макросы).

brizzz пишет:

Мета информацию можно хранить в twig-комментах. А по поводу опций... Их можно реализовать в другом месте

default/smile Если так извращаться, то опции тоже можно в тех же комментах Твига хранить, в json. Но один хрен БД в этом плане удобнее.

brizzz пишет:

Проверки синтаксиса шаблона не достаточно.

Ну, не обязательно это делать сразу на проде. Тут посыл несколько другой — автоматизация. Если действительно нужно только ручное ревью, то автоматической эту операцию конечно не сделаешь. Но можно например создать песочницу, где версия шаблонов будет билдиться и проходить все тесты. И в случае успешного прохождения — автоматом же апдейтить прод скриптом.

brizzz пишет:

Важнее дать возможность редактировать файлы переводов

Мигрировать на XLIFF и использовать стандартные инструменты для переводчиков. Вернее, это переводчики будут использовать эти инструменты, а вы им просто отдаете XLIFF и получаете в ответ XLIFF. Это «родной» формат для TRADOS (стандарт для переводчиков, примерно как Фотошоп для дизайнера).
Единственная проблема — в Симфони XLIFF используется не совсем стандартно (если вы используете ключи, а не оригинальный текст в качестве ключа). Из-за этого у переводчиков будут неудобства при переводе, так как по сути они вместо оригинального текста будут видеть ключи. Но это, опять же, больше их проблема, чем ваша. Можно конечно написать простенький скрипт, который будет конвертировать оригинальные XLIFF в удобные для переводчиков и потом результат их работы конвертить обратно. В любом случае, лучше XLIFF для этого ничего нет. Ямл для переводчиков — НЁХ, про пхп я уже молчу. А через веб-интерфейс тоже неудобно и медленно.

5

Re: Нужен бандл/библиотека для редактирования twig-шаблонов в браузере

добавляете дерево и получаете копию иерархии в ФС.

Тут только самому писать, видимо, надстройку на JS

Для новостей, статей, пошёл бы этому пути.

Но думаю в моём случае игра не будет стоить свеч default/smile Мне в итоге надо сэкономить время, которое потратит пара разработчик-менеджер на правку и доработку уведомлений. Работать с файлами всё равно проще, а менеджеру править сами шаблоны в которых даже текста не будет а только метки переводов не захочется вовсе. Пока попробую править шаблоны в режиме постановки задач. А потом может запилю всё-таки файловый менеджер если оно будет надо.

Раньше была идея полностью делигировать правку шаблонов менеджеру, но не пошло. Приходилось выбирать либо дублирование и много ручного труда менеджера, либо усложнение шаблонов. В итоге на третьей итерации прихожу ко второму варианту. Ибо в текстах уведомлениях с первым подходом воцарился хаос.

Но можно например создать песочницу, где версия шаблонов будет билдиться и проходить все тесты

По сути оно сейчас так и есть. Но тесты проверяют лишь факт отправки письма. Вообще, можно обойтись и без код-ревью. То есть менеджер же видит результаты своих правок, то пусть и ответсвенность за косяки несёт. Правда остаётся шанс, что какие-то правки привели к ошибке, которая тестами не улавливается.

Мигрировать на XLIFF и использовать стандартные инструменты для переводчиков

За это отдельное спасибо, особенно про нюанс про ключи. Как раз на очереди стоит рефакторинг файлов переводов. Оригинальный текст в качестве ключа пока мне кажется не очень удобным. Вообще именование ключей и структурирование файлов переводов задача, которой я пока не нашёл хорошего решения. То есть, как всё именовать и структурировать чтоб было понятно переводчику какой ключ где показывается, но тут уже видимо должен быть у каждого проекта свой подход. Хотя на эту тему даже есть кое какие стать с вариантами решений.

6

Re: Нужен бандл/библиотека для редактирования twig-шаблонов в браузере

brizzz пишет:

Оригинальный текст в качестве ключа пока мне кажется не очень удобным.

На самом деле это вовсе не решение, так как одна и та же фраза или слово, находящиеся в разных местах, в зависимости от контекста, легко могут иметь разные эквиваленты в другом языке. В хорошем переводе переводится не текст сам по себе, а его значение в контексте.
Простой скрипт может брать например англоязычный XLIFF файл перевода за основу и подставлять ключ в id блока, а в source оригинальный английский текст.  После чего переводчики могут спокойно грузить это в Традос. Обратно по аналогичной схеме — заменять оригинальный английский текст в source на значение, сохраненное в id, и результат совать в Симфони.

7

Re: Нужен бандл/библиотека для редактирования twig-шаблонов в браузере

Простой скрипт может брать например англоязычный XLIFF файл перевода за основу и подставлять ключ в id блока, а в source оригинальный английский текст.

Спасибо за помощь! Так тогда и сделаю default/smile