можно делать это через обращение к коннектору (как обрабатывается корзина в 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;

...