можно делать это через обращение к коннектору (как обрабатывается корзина в shopmodxbox)
Я по привычке использую другой вариант: создаю документ (например ajax), обязательно некешируемый, и для него создаю шаблон, делаю его статичным и назначаю ему свой php-файл (благодаря расширению templatephp код шаблона может содержать php инструкции) — и там творю что душе угодно. там доступен весь MODX c его вкусностями:
<?php if($_SERVER['HTTP_X_REQUESTED_WITH']=='XMLHttpRequest'){ switch($_REQUEST['action']){ case 'getmenu': $id=(int)$_REQUEST['id']; $r=$modx->getObject('modResource',array('id'=>$id,'template'=>20)); if($r){ $output=$r->get('content'); $maxIterations= intval($modx->getOption('parser_max_iterations', $params, 10)); $modx->parser->processElementTags('', $output, true, false, '[[', ']]', array(), $maxIterations); $modx->parser->processElementTags('', $output, true, true, '[[', ']]', array(), $maxIterations); $ttl=$r->get('longtitle'); if(empty($ttl)) $ttl=$r->get('pagetitle'); return $output; } else{ return 'Ошибка: страница не найдена'; } break; case 'service': $id=(int)$_REQUEST['id']; $r=$modx->getObject('modResource',array('id'=>$id,'template:in'=>array(3,17))); if($r){ $output=$r->get('content'); $maxIterations= intval($modx->getOption('parser_max_iterations', $params, 10)); $modx->parser->processElementTags('', $output, true, false, '[[', ']]', array(), $maxIterations); $modx->parser->processElementTags('', $output, true, true, '[[', ']]', array(), $maxIterations); $ttl=$r->get('longtitle'); if(empty($ttl)) $ttl=$r->get('pagetitle'); $out=json_encode(array('title'=>$ttl, 'content'=>$output, 'alias'=>$r->get('alias'))); return $out; } else{ return json_encode(array('title'=>'Ошибка: страница не найдена', 'content'=>'')); } break; ...