fenom-template / fenom

Template Engine for PHP. Maintainers wanted!
Other
446 stars 108 forks source link

Как сделать так, чтобы Fenom не ломал сайт на MODX? #308

Open sergx opened 4 years ago

sergx commented 4 years ago

По тем или иным причинам может так быть, что парсится код, не предназначенный для Fenom, но содержащий {. Было бы очень здорово, если бы вместо ошибки, роняющей страницу, работал бы механизм типа ignore, и этот блок не обрабатывался, а выводился бы "как есть". Есть ли в планах внедрить такой механизм? Или может быть уже сейчас есть какая-то настройка типа "soft-mode", позволяющая переключить парсер в щадящий режим? В частности меня волнует реализация в MODX.

pafnuty commented 4 years ago

@sergx Надо бы побольше контекста, т.к. не совсем понятно какой код парсится, но мне кажется, что можно посмотреть в сторону https://github.com/fenom-template/fenom/blob/master/docs/ru/ext/extend.md#Расширение-тестового-оператора либо, если есть возможность, после открывающей скобки ставить новую строку.

touol commented 4 years ago

Больше контекста в обсуждении здесь https://modx.pro/help/19203

pafnuty commented 4 years ago

Из темы на сайте я понял, что есть две проблемы:

  1. Данные, которые приезжают в контенте.
  2. Код, который добавляется в шаблон.

В первом случае точно стоит убрать весь контент сайта в {ignore} т.к. контент в принципе не должен обрабатываться шаблонизатором ну и никто не мешает вставить валидный тег, который положит сайт.

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

Для меня, как человека далёкого от MODX (бэкграунд bitrix и dle и к обоим системам я прикручивал fenom) в целом понятна проблема, я бы тоже очень хотел защитить сайт от поломок со стороны контент-редакторов и "программистов-менеджеров", но как для владельца сайта - я бы сильно надавал по рукам тем контент-редакторам, которые не понимают с какой системой работают и сразу бы выдал нужные инструкции, а ещё лучше записал бы демо как можно и как не стоит делать :))

Ну и в коментах был предложен код, который вполне можно попробовать оформить в виде PR и улучшить шаблонизатор, @bzick насколько я знаю, всегда рад улучшениям. Если сделать настраиваемый (на свой страх и риск) уровень обработки ошибок, вероятно это поможет кому-то жить спокойно.

P.S. JS из тела выносить нужно и это можно сделать в 99,9999% случаев. Есть куча возможностей.

touol commented 4 years ago

Ну и в коментах был предложен код, который вполне можно попробовать оформить в виде PR и улучшить шаблонизатор, @bzick насколько я знаю, всегда рад улучшениям.

В коментах я костыль предложил :-(. Вообще по хорошему, чтоб решить эту проблему, надо бы в феноме сделать опцию, при включении которой, феном, вместо выбрасывания исключения, писал ошибку в лог. И можно было использовать феном так ` $tpl = $fenom->getRawTemplate()->source($name, $content, true);

$content = $tpl->fetch($properties);

if($tpl->getError()){ ... } ` В, принципе, я могу сделать такую фичу, но, во первых, надо договориться с разработчиками fenom, что такая фича нужна. Просто так тратить время мне, да и никому, не охота. Во вторых, возможно, потребуются консультации.

touol commented 4 years ago

P.S. JS из тела выносить нужно и это можно сделать в 99,9999% случаев. Есть куча возможностей.

В MODX в теле активно используется JSON и вынести его из тела нельзя.

pafnuty commented 4 years ago

@touol ну тогда однозначно не стоит обрабатывать контент шаблонизатором. С этим есть сложности?

touol commented 4 years ago

@pafnuty У меня лично с контентом особых проблем не возникало.

А вот иногда нужно включить fenom на сайте, который на половину написан другими программистами, и сразу возникают проблемы с JSON и JS. На феноме многие вещи в MODX писать удобнее, чем на его стандартном синтаксисе. То есть, мне удобнее включить феном. А вот синтаксис популярных сниппетов MODX использует JSON. И сайт вылетает. Мое мнение, что, если fenom, на тех тегах что не может опознать, вместо исключения пропускал их как они есть, то тогда было бы намного удобнее.

Pathologic commented 4 years ago

@pafnuty Все дело в том, что в MODX Revo обработка феномом запускается несколько раз, отсюда и все проблемы у пользователей. Сделать однократный запуск возможно, но автор интеграции отказался, так как это ломает подход к разработке, принятый в MODX.

https://github.com/fenom-template/fenom/issues/258 - повтор.

touol commented 4 years ago

@Pathologic не вводите в заблуждение. Это не причем. Не корректный тег и феном в любом случае пустую страницу отдаст. Он так устроен. А... прочитал ссылку. Тут проблема не с ignore. Тут мы тупо хотим, чтоб тег, не правильный с точки зрения феном, тупо иногрировался и сайт не ломался. Раздражает искать включения JS/JSON по по всему сайту и ставить пробелы.

Было бы очень здорово, если бы вместо ошибки, роняющей страницу, работал бы механизм типа ignore, и этот блок не обрабатывался, а выводился бы "как есть". Есть ли в планах внедрить такой механизм? Или может быть уже сейчас есть какая-то настройка типа "soft-mode", позволяющая переключить парсер в щадящий режим?

Pathologic commented 4 years ago

@touol Тег ignore для того и предназначен, чтобы обозначить места, которые не должен обрабатывать шаблонизатор, тогда и ошибок никаких не будет. В общем случае, у вас эта проблема будет с любым шаблонизатором, если использовать их так, как сейчас используется феном в рево. Вообще, не смущает, что с этой проблемой приходят только из рево? Что только там в документации написано пробелы после скобок ставить? :smiley:

touol commented 4 years ago

Вообще, не смущает, что с этой проблемой приходят только из рево?

Не смущает. Для других вылет сайта при ошибке в написании тега - это типа се ля ви. Привыкли и о другом не думают. А в MODX, при ошибке в его тегах, тег просто не срабатывает и все. И хочется чтоб при использовании феном было так же. В самом феноме без MODX ошибки не куда пихать. Ее надо разрабу сообщить и логично вызвать исключение с выводом на страницу типа Fatal error: Uncaught exception 'Fenom\Error\UnexpectedTokenException' with message 'Unexpected end of expression' in D:\OpenServer\domains\modx.loc\modMiniIDE\model\vendor\fenom\src\Fenom\Template.php:789 Stack trace: #0 D:\OpenServer\domains\modx.loc\modMiniIDE\model\vendor\fenom\src\Fenom\Compiler.php(102): Fenom\Template->parseExpr(Object(Fenom\Tokenizer)) #1 [internal function]: Fenom\Compiler::ifOpen(Object(Fenom\Tokenizer), Object(Fenom\Tag)) #2 D:\OpenServer\domains\modx.loc\modMiniIDE\model\vendor\fenom\src\Fenom\Tag.php(146): call_user_func('Fenom\\Compiler:...', Object(Fenom\Tokenizer), Object(Fenom\Tag)) #3 D:\OpenServer\domains\modx.loc\modMiniIDE\model\vendor\fenom\src\Fenom\Template.php(651): Fenom\Tag->start(Object(Fenom\Tokenizer)) #4 D:\OpenServer\domains\modx.loc\modMiniIDE\model\vendor\fenom\src\Fenom\Template.php(580): Fenom\Template->parseAct(Object(Fenom\Tokenizer)) #5 D:\OpenServer\domains\modx.loc\modMiniIDE\model\vendor\fenom\src\Fenom\Template.php(274): Fenom\Template->parseTag(Object(Fenom\Toke in main.tpl on line 18

А в Modx с феном получаем пустую страницу и не совсем информативное сообщение в логах pdotools.class.php : 996) Unclosed tag: {if} opened on line 74

Для Modx много удобней чтоб ошибочные теги выводились как есть. Я 6 лет назад сделал сайт на Modx без феном. Тогда его для MODX не было. Сейчас уже к феном привык и хотел бы его использовать на этом сайте. Но стопудово это его сломает :-(. Там куча и JSON и JS. А если бы феном для Modx выводил ошибочные теги как есть, то я бы сразу там феном и включил :-).

pafnuty commented 4 years ago

@touol по диагонали глянул pdoTools https://github.com/bezumkin/pdoTools/blob/master/core/components/pdotools/model/pdotools/_fenom.php и вижу, что он расширяет стандартные классы фенома https://github.com/bezumkin/pdoTools/blob/cc76f5f786d1a2f2d49ff9fc2335cad7ccf072e6/core/components/pdotools/model/pdotools/_fenom.php#L23-L27 Мне кажется логичнее добавить обработку и пропуск ошибок компиляции в pdoTools.

pafnuty commented 4 years ago

https://github.com/bezumkin/pdoTools/blob/master/core/components/pdotools/model/pdotools/pdotools.class.php#L988 вот тут ещё обработка ошибок. Опция pdotools_fenom_save_on_errors не поможет в отлове ошибок?

Pathologic commented 4 years ago

@touol Между парсером MODX и феномом существует принципиальная разница: первый ищет в шаблоне теги и заменяет их текстом в момент вывода; второй сначала преобразовывает шаблон в php-код, который затем и выполняет вывод. Соответственно если игнорировать ошибки компиляции, то получим на выходе некорректный php-код. Другими словами у вас феном или будет работать или не будет, а так, что местами работает, местами не работает - не получится.

touol commented 4 years ago

Мне кажется логичнее добавить обработку и пропуск ошибок компиляции в pdoTools.

В, принципе, да. Проблемы специфичные для MODX и решать их, по идее, нужно в нем. Я с феном на других CMS не работал. Не знаю пригодиться ли замена исключений логом в них. В чистом феном вроде не пригодиться. В pdoTools можно расширить класс Template и в нем переписать метод compile, добавить лог и т.д., а в fenomX переписать метод public function getRawTemplate(Template $parent = null) { return new Template($this, $this->_options, $parent); } с новым классом. Так, вообщем, тему здесь @sergx поднял. Я только подключился. И фича может могла пригодиться в самом феноме. И, думаю, самое главная причина почему тема всплывает здесь это то, что issues в https://github.com/bezumkin/pdoTools отключены. Они только PR принимают. И проблема бывает есть и ее не обсудить :-(. Только как до PR своими мозгами дотумкаешь только тогда проблему и можно исправить.

Pathologic commented 4 years ago

https://github.com/bezumkin/pdoTools/pull/267/files - вот с этой правкой феном будет работать корректно при правильном подходе.

touol commented 4 years ago

Другими словами у вас феном или будет работать или не будет, а так, что местами работает, местами не работает - не получится.

@Pathologic Однако вот получилось :-)

Pathologic commented 4 years ago

@touol Это мало чем отличается от рекомендации пробелы после скобок расставлять.

touol commented 4 years ago

@Pathologic фишка в том что не надо везде лазить и пробелы ставить :-). И ignore тоже не надо :-)

touol commented 4 years ago

@pafnuty Я что-то не особо разбираюсь в публичных приватных методов класса. https://github.com/touol/pdoTools/blob/extends-Template/core/components/pdotools/model/fenom/TemplateX.php Здесь заменил функцию, но нарвался на

pdotools.class.php : 993) Unknown method _appendText

То есть, в классе Template полно приватных методов и мне чтоб заменить 1 функцию надо его полностью скопировать? :-(

rednakse commented 4 years ago

Это, конечно, сильные ограничения разраба, но можно вызывать приватные методы через Reflection.. Например, вот так:

class someClass extends someParentClass
{
    public function someMethod()
    {
        $somePrivateMethod new \ReflectionMethod('someParentClass', 'privateMethod');
        $somePrivateMethod->setAccessible(true);
        $somePrivateMethod->invoke($this);
    }
}

Это чертовский костыль, но рабочий.

touol commented 4 years ago

@rednakse ради правок в 10 строк кода городить огород на 100+ строк?? Как-то не айс. Сделал PR и на fenom и на pdoTools. Авось примут :-).

sergant210 commented 4 years ago

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

sergant210 commented 4 years ago

Сделал PR и на fenom и на pdoTools. Авось примут :-).

@touol Я бы на это не рассчитывал. Если здесь ещё есть крошечная вероятность, то про pdoTools забудь. Самый лучший выход - сделать пакет, расширяющий pdoTools.