Jump to main content Jump to doc navigation

Используйте страницу, когда нужно разобрать сниппеты, чанки или теги лексиконов вне обычной отрисовки страницы: при генерации тела письма или при возврате полностью обработанного содержимого из API.

modX::getChunk уже прогоняет парсер по чанку. Не разобранными остаются некэшируемые теги — [[!Wayfinder]], [[!getResources?…]] — потому что modChunk::process() передаёт парсеру флаг isProcessingUncacheable(), а вне отрисовки он равен false.

Дописать разбор помогает modParser::processElementTags().

Из чанка

getChunk() уже обработал кэшируемые теги, поэтому достаточно одного прохода:

$content = $modx->getChunk('MyChunkName', ['foo' => 'bar']);

$parser = $modx->getParser();
$maxIterations = (integer) $modx->getOption('parser_max_iterations', null, 10);

// Разбираем некэшируемые теги, убирая всё, что разобрать не удалось
$parser->processElementTags('', $content, true, true, '[[', ']]', [], $maxIterations);

return $content;

Из сырого содержимого

modElement::getContent() возвращает исходник как есть, со всеми тегами. Разбирайте его в два прохода: первый обрабатывает кэшируемые теги, второй — некэшируемые.

$chunk = $modx->getObject('modChunk', 'MyChunkName');
$content = $chunk->getContent();

$parser = $modx->getParser();
$maxIterations = (integer) $modx->getOption('parser_max_iterations', null, 10);

$parser->processElementTags('', $content, false, false, '[[', ']]', [], $maxIterations);
$parser->processElementTags('', $content, true, true, '[[', ']]', [], $maxIterations);

return $content;

[!WARNING] Каждый вызов processElementTags() вызывает событие плагина OnParseDocument. Рецепт с двумя проходами вызывает его дважды — плагины на этом событии отработают дважды и могут изменить содержимое через переданную ссылку.

Справка по методу

$processed = $parser->processElementTags(
    $parentTag,
    &$content,
    $processUncacheable = false,
    $removeUnprocessed = false,
    $prefix = '[[',
    $suffix = ']]',
    $tokens = [],
    $depth = 0
);
Параметр Назначение
$parentTag Тег обрабатываемого элемента. Совпадающий с ним тег обнуляется, чтобы парсер не съел собственный разделитель; передайте '', чтобы отключить проверку
$content Разбираемая строка. Передаётся по ссылке — результат пишется обратно в переменную, а не возвращается
$processUncacheable Обрабатывать ли на этом проходе теги [[!…]]
$removeUnprocessed Убирать ли теги без вывода вместо того, чтобы оставить их на месте
$prefix / $suffix Разделители, по умолчанию [[ и ]]
$tokens Ограничить разбор указанными первыми символами-токенами (+, %, ~, $, *, -). Пустой массив означает «все»
$depth Число дополнительных проходов по выводу

Возвращаемое значение — количество обработанных тегов.

Глубина разбора

$depth считает дополнительные проходы, а не уровни вложенности. Счётчик уменьшается на единицу при входе, и следующий проход выполняется, только пока он больше нуля, поэтому 10 даёт не более десяти проходов по содержимому.

Значение берётся из parser_max_iterations, и это не системная настройка — в менеджере её нет. modX::getOption() обращается к $modx->config, поэтому задавайте её в core/config/config.inc.php:

$config_options = ['parser_max_iterations' => 20];

По умолчанию 10.

Зачем два прохода

Настройка parser_recurse_uncacheable (настоящая системная настройка, включена по умолчанию) запрещает парсеру встраивать вывод некэшируемых элементов в кэшируемое содержимое. Если её выключить, вывод некэшируемого элемента может закэшироваться внутри окружающего кэшируемого содержимого — поэтому проход с некэшируемыми тегами идёт последним.

Смотрите также

Support the team building MODX with a monthly donation.

The budget raised through OpenCollective is transparent, including payouts, and any contributor can apply to be paid for their work on MODX.

Backers

  • modmore
  • STERC
  • Digital Penguin
  • Jens Wittmann – Gestaltung & Entwicklung
  • CrewMark
  • Fabian Christen
  • Sepia River Studios
  • Dannevang Digital
  • A. Moreno
  • Alex
  • Chris Fickling
  • Stéphane Jäggi
  • YJ
  • Murray Wood
  • JT Skaggs
  • Anton Tarasov
  • deJaya
  • Lefthandmedia
  • eydolan
  • Following Sea
  • Guido Gallenkamp
  • Raffy
  • Snow Creative
  • Nick Clark
  • Guest
  • Helen
  • krisznet
  • Yanni
  • Richard

Budget

$186 per month—let's make that $500!

Learn more