Некорректная работа сниппета Markdown
Столкнулся со странным поведением сниппета Markdown, когда его несколько раз вызываю на странице с опцией 'escapeTags' => false (выключает экранирование тэгов MODX, чтоб всякие ссылки обрабатывались).
Выражается в том, что во все места вызова он вставляет обработанный контент первого вызова. При чем не важно что у него было на входе: 'field' => 'content' или же 'input' => $_modx->resource.content
В случаях, когда вызывается pdoResources и в чанке нужно обработать каждый introtext или контент, либо на странице нужно обработать и introtext и content, приходится, например, включать экранирование тэгов, что не очень хорошо.
Например
В шаблоне:
В итоге покопавшись, вроде бы нашел причину в сниппете:
Поменял вот так и заработало!
Теперь при вызове
Может можно было как-то элегантнее сделать?
Выражается в том, что во все места вызова он вставляет обработанный контент первого вызова. При чем не важно что у него было на входе: 'field' => 'content' или же 'input' => $_modx->resource.content
В случаях, когда вызывается pdoResources и в чанке нужно обработать каждый introtext или контент, либо на странице нужно обработать и introtext и content, приходится, например, включать экранирование тэгов, что не очень хорошо.
Например
В шаблоне:
{'Markdown' | snippet : [
'input' => '111 {2 | url}',
'escapeTags' => false
]}
{'Markdown' | snippet : [
'input' => '222 {3 | url}',
'escapeTags' => false
]}
{'Markdown' | snippet : [
'input' => '333 {4 | url}',
'escapeTags' => false
]}
Получается:111 /sitemap.xml
111 /sitemap.xml
111 /sitemap.xml
Если включить экранирование:{'Markdown' | snippet : [
'input' => '111 {2 | url}',
'escapeTags' => true
]}
{'Markdown' | snippet : [
'input' => '222 {3 | url}',
'escapeTags' => true
]}
{'Markdown' | snippet : [
'input' => '333 {4 | url}',
'escapeTags' => true
]}
Получается без копий, но и без обработанных тэгов:111 {2 | url}
222 {3 | url}
333 {4 | url}
Если же чередовать true и false, то такие повторы тоже присутствуют.В итоге покопавшись, вроде бы нашел причину в сниппете:
// Parse MODX tags
if (empty($escapeTags)) {
$input = $modx->newObject('modChunk')->process(null, $input); // <---- вот тут
} else {
$input = preg_replace('/=`(.*?)`/', '=`$1`', $input);
}
С включенной настройкой pdotools_fenom_parser, видимо, не корректно работает такая конструкция.Поменял вот так и заработало!
if (empty($escapeTags)) {
if ($modx->getOption('pdotools_fenom_parser', null, false, true) && ($pdo = $modx->getService('pdoTools'))) {
$input = $pdo->parseChunk('@INLINE ' . $input);
} else {
$input = $modx->newObject('modChunk')->process(null, $input);
}
} else {
$input = preg_replace('/=`(.*?)`/', '=`$1`', $input);
}
т.е. если включен парсер на страницах, то обработать инпут через него, а иначе — через стандартный MODX.Теперь при вызове
{'Markdown' | snippet : [
'input' => '111 {2 | url}',
'escapeTags' => false
]}
{'Markdown' | snippet : [
'input' => '222 {3 | url}',
'escapeTags' => false
]}
{'Markdown' | snippet : [
'input' => '333 {4 | url}',
'escapeTags' => false
]}
получается всё правильно111 /sitemap.xml
222 /robots.txt
333 /404
Хотелось бы услышать мнения о корректности такого решения :) Может можно было как-то элегантнее сделать?