Да, указать переменную шаблона действительно можно, просто из прошлого коммента подумалось типа {if}{extends ...}{else}..{/if}. Такое там не канает. А с переменной получается следующее: 1. В __construct лезть не оязательно, у нас же за все отвечает единый контроллер base.php Прописываем в нем условие: <?php // .................................. if($_SERVER['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest'){ $modx->setOption('layout', 'ajax-layout.tpl'); $compile_id = 'ajax'; } else{ $modx->setOption('layout', 'layout.tpl'); $compile_id = 'layout'; }
return $modx->smarty->fetch("tpl/{$tpl}", '', $compile_id); Обязательно задаем разные $compile_id, иначе не будет перекомпиливаться уже отработанный шаблон. 2. Создаем ajax-layout.tpl В нем пишем: {block name=content} {$modx->resource->content} {/block} 3. Создаем промежуточный switch-layout.tpl, с содержимым: {extends $modx->getOption('layout', null, 'layout.tpl')} Здесь один минус есть: в рабочем режиме у шаблонов переменная phptemplates.non-cached == false, и Smarty-шаблоны при повторном заходе не отрабатываются. Так что придется некеширование выставлять в true, что конечно же скажется на производительности. Можно конечно в настройках modxSmarty включить кеширование самих смарти-шаблонов, но это усложняет разработку, ибо надо будет более четко продумывать где что кешировань/не кешировать, и прописывать где надо nocache. Но если это правильно использовать, то нагрузка не должна увеличиться так, чтобы заметно было. P.S. За полезный коммент поднимаю права до члена Клуба :)