Так получилось, что у меня самого возникла проблема вызова одного сниппета из другого. По некоторым причинам на конкретном сайте я не вставляю в шаблон [*content*], а вызываю сниппет, который в зависимости от разных условий либо подставляет контент, либо делает другие вещи. При этом возникла проблема, если в контенте имеется вызов других сниппетов. Для ее решения я в свой сниппет добавил такие строки:
if (strpos($myText, '[[') > -1)
$result.=$modx->parseDocumentSource($myText);
else
$result.=$myText;
То есть если в генерируемом тексте имеется кэшируемый вызов сниппета, он будет выполнен до того, как завершит работу мой сниппет. В случае, когда я кэширую вызов своего сниппета, результат работы другого будет в нем присутствовать. А для некэшируемых вызовов я добавил небольшой плагин, привязав его к событию OnWebPagePrerender:
/*
* Выполнение кэшированных вызовов сниппетов
* автор AKots
*/
$e =& $modx->event;
switch ($e->name ) {
case 'OnWebPagePrerender':
if (strpos($modx->documentOutput, '[!') > -1) {
$modx->documentOutput= str_replace('[!', '[[', $modx->documentOutput);
$modx->documentOutput= str_replace('!]', ']]', $modx->documentOutput);
$modx->documentOutput= $modx->parseDocumentSource($modx->documentOutput);
if (strpos($modx->documentOutput, '[~') > -1) {
$modx->documentOutput= $modx->rewriteUrls($modx->documentOutput);
}
}
break ;
default:
return ;
}Если после того, как все сниппеты, даже некэшируемые, уже выполнены, а в тексте остались вызовы некэшируемых сниппетов, они выполнятся. Следует отметить, что данный плагин имеет определенные ограничения, связанные с тем, что событие OnWebPagePrerender возникает несколько позже, чем хотелось бы, так что при использовании плагина надо проверить работу страниц, где используются другие плагины и сниппеты.