можно делать это через обращение к коннектору (как

можно делать это через обращение к коннектору (как обрабатывается корзина в shopmodxbox) Я по привычке использую другой вариант: создаю документ (например ajax), обязательно некешируемый, и для него создаю шаблон, делаю его статичным и назначаю ему свой php-файл (благодаря расширению templatephp код шаблона может содержать php инструкции) — и там творю что душе угодно. там доступен весь MODX c его вкусностями:

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;
...