Да, указать переменную шаблона действительно можно, просто из прошлого коммента подумалось типа {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. За полезный коммент поднимаю права до члена Клуба :)