1. При вызове через коннекторы не вызываются MODX-ивенты, и самое главное — OnHandleRequest, а именно на это событие срабатывает плагин, инициализирующий modxSmarty (объект $modx->smarty). То есть если вызывать процессор через коннектор, в процессоре не будет смарти, а вопрос был именно про смарти. При оформлении заказа у нас процессор корзины вызывается на самой странице безаджаксово, поэтому $this->modx->smarty в процессоре доступен. Если через коннектор его вызывать, то не будет объект $this->modx->smarty и выполнение завершится фатальной ошибкой.
Сразу скажу, что если мне нужен смарти в процессоре при вызове через коннектор, я делаю так: в процессоре дописываю код в initialize()
public function initialize(){ if(empty($this->modx->smarty)){ $this->modx->invokeEvent('OnHandleRequest'); } return parent::initialize(); }
2. Старайтесь не использовать этой конструкции if($_SERVER['HTTP_X_REQUESTED_WITH']=='XMLHttpRequest'){… Зачем вам она нужна? Если у вас в логике уже прописано switch($_REQUEST['action']), то это уже фильтрует запросы. Какая разница вам аджаксом запрос отправлен или нет? И, на смарти твой пример надо бы переписать, чтобы по сабжу было :)
3. Под каждый запрос шаблон создавать — не кашерно. Просто документу указывать без шаблона, а в контент прописывать путь до смарти-шаблона [[!smarty?tpl=`......`]]. А в нем уже все прописывать что нужно, и если надо отдать именно в JSON, то преобразовываем данные. Самый простой способ — это вызвать подшаблон, полученные данные в переменную зафигачить и преобразовать данные:
{include $tpl_path assign=result} {json_encode($result)}