Некорректная работа сниппета Markdown

Столкнулся со странным поведением сниппета Markdown, когда его несколько раз вызываю на странице с опцией 'escapeTags' => false (выключает экранирование тэгов MODX, чтоб всякие ссылки обрабатывались).

Выражается в том, что во все места вызова он вставляет обработанный контент первого вызова. При чем не важно что у него было на входе: '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
Хотелось бы услышать мнения о корректности такого решения :)
Может можно было как-то элегантнее сделать?
Dmitry P.
04 июня 2019, 19:59
modx.pro
602
0

Комментарии: 0

Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
0