Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
sergx opened this issue Nov 11, 2019 · 24 comments
Labels
modx Issues with fenom modx integration

Comments

@sergx
Copy link

sergx commented Nov 11, 2019

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

@pafnuty
Copy link
Member

pafnuty commented Nov 12, 2019

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

@touol
Copy link

touol commented Nov 12, 2019

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

@pafnuty
Copy link
Member

pafnuty commented Nov 12, 2019

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

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

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

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

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

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

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

@touol
Copy link

touol commented Nov 13, 2019

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

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

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

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

@touol
Copy link

touol commented Nov 13, 2019

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

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

@pafnuty
Copy link
Member

pafnuty commented Nov 13, 2019

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

@touol
Copy link

touol commented Nov 13, 2019

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

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

@Pathologic
Copy link

Pathologic commented Nov 13, 2019

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

#258 - повтор.

@touol
Copy link

touol commented Nov 13, 2019

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

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

@Pathologic
Copy link

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

@touol
Copy link

touol commented Nov 13, 2019

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

Не смущает. Для других вылет сайта при ошибке в написании тега - это типа се ля ви. Привыкли и о другом не думают. А в 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 pafnuty changed the title Как сделать так, чтобы Fenom не ломал сайт? Как сделать так, чтобы Fenom не ломал сайт на MODX? Nov 14, 2019
@pafnuty
Copy link
Member

pafnuty commented Nov 14, 2019

@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
Copy link
Member

pafnuty commented Nov 14, 2019

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

@Pathologic
Copy link

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

@touol
Copy link

touol commented Nov 14, 2019

Мне кажется логичнее добавить обработку и пропуск ошибок компиляции в 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
Copy link

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

@touol
Copy link

touol commented Nov 14, 2019

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

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

@Pathologic
Copy link

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

@touol
Copy link

touol commented Nov 14, 2019

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

@touol
Copy link

touol commented Nov 14, 2019

@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
Copy link

rednakse commented Nov 14, 2019

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

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

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

@touol
Copy link

touol commented Nov 14, 2019

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

@sergant210
Copy link

sergant210 commented Nov 26, 2019

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

@pafnuty pafnuty added the modx Issues with fenom modx integration label Nov 26, 2019
@sergant210
Copy link

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

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
modx Issues with fenom modx integration
Projects
None yet
Development

No branches or pull requests

6 participants