Как сделать так, чтобы Fenom не ломал сайт?
Вопрос такой — есть ли способ сделать так, чтобы Fenom не ломался после того, как наткнется на «неожиданный символ», который тут поставлен не для него, а просто в коде JS/JSON/..? (Не {ignore})
Ситуация простая и понятная — на сайте стоит феном и активно используется везде. Но если вставить какой-нибудь JS код, или иной код с фигурной скобкой — все. Страница не открывается. Ошибка в логе.
Я знаю, что есть {ignore}, но это не решение, когда менеджер может вставить JS Код в редакторе.
Эмоциональное дополнение — И в принципе это мне кажется очень недружелюбным подходом, т.к. в любом месте сайта может появиться скобочка (например вставили счетчик в шаблон), и сайт ломается. Я уверен, что так быть не должно. Почему бы феному просто не проигнорировать тот набор символов, которые он не может прочитать? Почему он должен ломать всю страницу, если ему что-то не понравилось!? И для тестирования просто иметь иметь какую-то настройку — типа «строгий режим» для разработки, и мягкий — для рабочего сайта.
Я понимаю, что есть полу-решения, например — обернуть вызов [[*content]] в {ignore}. Но что если на какой-то странице шаблона мне все таки нужен синтаксис Fenom? То есть это не универсальное решение, а костыль.
Upd
С подачи Артема разместил вопрос на Гитхабе — github.com/fenom-template/fenom/issues/308
Ситуация простая и понятная — на сайте стоит феном и активно используется везде. Но если вставить какой-нибудь JS код, или иной код с фигурной скобкой — все. Страница не открывается. Ошибка в логе.
Я знаю, что есть {ignore}, но это не решение, когда менеджер может вставить JS Код в редакторе.
Эмоциональное дополнение — И в принципе это мне кажется очень недружелюбным подходом, т.к. в любом месте сайта может появиться скобочка (например вставили счетчик в шаблон), и сайт ломается. Я уверен, что так быть не должно. Почему бы феному просто не проигнорировать тот набор символов, которые он не может прочитать? Почему он должен ломать всю страницу, если ему что-то не понравилось!? И для тестирования просто иметь иметь какую-то настройку — типа «строгий режим» для разработки, и мягкий — для рабочего сайта.
Я понимаю, что есть полу-решения, например — обернуть вызов [[*content]] в {ignore}. Но что если на какой-то странице шаблона мне все таки нужен синтаксис Fenom? То есть это не универсальное решение, а костыль.
Upd
С подачи Артема разместил вопрос на Гитхабе — github.com/fenom-template/fenom/issues/308
Комментарии: 32
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
Сергей, я полностью Вас поддерживаю в вашем вопросе, мое мнение, что действительно необходимо что-то с этим делать, так быть не должно.
Теперь готов выслушать критику. )))
По поводу поста — я в целом согласен.
И еще, Сергей пишет о том, что менеджер может в любой момент вставить фигурную скобку в редакторе, и что постоянно за ним следить? Тут конечно единственный вариант, использовать тег {ignore}, других вариантов не вижу.
Или, допустим у меня есть большой сайт без фенома, и я делаю рефакторинг, внедряю феном. Тут уже программист, а не менеджер может что-то упустить.
Или текстовый редактор может быть не только у контента. Или — текстовый редактор может впоследствии появится у какого-то поля, в которое менеджер скопирует некий невалидный код.
Сценариев масса, и писать плагин на обработку каждого ТВ поля — это очень грустный сценарий.
Собственно, нравится Fenom — извольте учитывать его особенности и решать их при необходимости.
Если вы хотите, чтобы проблему решили в ядре, то вы явно не по адресу, вам сюда: github.com/fenom-template/fenom/issues
Если не нравится особенность Fenom'а, то всегда можно отказаться от него в пользу доисторических фильтров MODX.
Я ищу вариант плагина, который не давал бы феному положить сайт. Но как именно его написать я не представляю. Но теоретически мне кажется можно, т.к. феном ведь генерирует ошибку, и указывает на строку. Но вот вместо ошибки переключить бы парсер в режим «ignore» для этой части кода. Может быть у кого-то есть подобное решение?
Срабатывает до парсинга тегов. Получаем любое поле ресурса, и заменяем скобки на спецсимволы. Пробел после добавил, иначе они преобразуются в скобку здесь на сайте. Так можно прогнать все поля, которые заполняет контент-менеджер. Причём плагин заменяет скобки только в момент открытия страницы. Исходники по факту остаются не тронутыми.
И поддержка от заинтересованных лиц не помешала бы. А вот заинтересованные лица «жуют попкорн» :-).
В принципе, ее там можно заменить чем-то другим, но спецсимволов на клаве не так много, и все где-то используются. А двойным символом заменять не красиво и не удобно :-(.
Думаю лучше чтоб на этой строке github.com/fenom-template/fenom/blob/fc188a582229c7735df1bb584eb268548a957f46/src/Fenom/Template.php#L276
не создавалось исключение с обрывом компиляции, а чтоб ошибка кидалась в лог и компиляция продолжалась.
Лог прикрутить довольно сложно.
Возвращает уже откомпилированную страницу. Не массив. И чтоб метод вернул массив много изменений надо.
Можно сделать костыль. Вместо исключения
Запихать ошибку в текст страницы
И уже в MODX в pdoParser вылавливать ошибку в тексте и писать ее в лог MODX.
Ну вот так по идее можно решить проблему :-)
ФаритПо-вашему рецепту эта ошибка вылезет намного позже и с наслоениями, вероятно у других людей, возможно у менеджеров.
То есть, не понятно в каком шаблоне или чанке или контенте или tv. Ищи где хочешь.
Оказалось в шаблоне нашел и поправил быстро. Но пришлось поволноваться. Ошибку вызывает вызов типа
Сейчас я воспроизвел ее на тестовом сайте. yadi.sk/i/fPFVkXKf9M8oIQ
Вчера я наметил идею. То есть, не окончательный вариант. Счас попробуем реализовать.
Реализовал. Вот изменения:
Файл core/components/pdotools/vendor/fenom/fenom/src/Fenom/Template.php со строки 273
Файл core/components/pdotools/model/pdotools/pdotools.class.php со строки 580
Журнал ошибок
Страница нормально грузиться yadi.sk/i/yTdJ1mWadBz_nQ и если бы у меня на тестовом сайте было бы поле modResource.active то и сниппет бы нормально отработал. То есть, все JS/JSON отработали бы без ошибок.
ФаритА теперь представьте, что сайт уже ушел менеджеру, и он случайно в меню нашел кнопку «Обновить», по привычке с Гмаркетом или Апстором нажал её не сделав бэкапы…
Единственное если менеджер поставит открывающую скобку без закрывающей, то сайт сломается на строке github.com/fenom-template/fenom/blob/fc188a582229c7735df1bb584eb268548a957f46/src/Fenom/Template.php#L248 Но я даже не знаю как это обойти :-(. Можно, конечно, так же, вместо исключения, запихать ошибку в лог и тег проигнорировать, но скорее всего fenom поймает закрывающую скобку хорошего тега и сайт снова сломается. В смысле поломается порядок тегов. Вместо {'asd' | snippet} в обработку попадет {текст {'asd' | snippet}
А то чувствую в отказ уйдут.
github.com/fenom-template/fenom/issues/308
Транспортный пакет с правками pdoTools и fenom file.modx.pro/files/7/5/8/758e797e15b740fd58e7993054996bc3.zip (переименовать в pdotools-2.13.0-pl.transport.zip)
Есть желающие протестировать? Вдруг что-то еще поправить надо.
Вставляю
на сайте { Администратор по умолчанию
{if {$_modx->user.fullname}
{if} Администратор по умолчанию
Сломался. Так как не закрытый блок. Только, что-то сомнительно, чтоб менеджеры {if или {if true} нечаянно написали.
на сайте: {a {$_modx->user.fullname}
А вот это могут :-(.
Ну меня, пока, устраивает, что не ломается по каждому чиху. Посмотрим что дальше будет.
Можно дописать модификатор
И затем выводить контент так
В следующий PR включу :-).
Какой именно js-код нельзя вынести в отельный файл?