Собственно, можно и ditto пристроить к этому делу, но мне тогда показалось что, он слишком много запросов генерит.
Сейчас у него с этим делом получше, а код работает:
if (!isset($id)) $id=$modx->documentIdentifier;
// получаем Серию мотоциклов
$BikesSeries = $modx->getActiveChildren($id, 'pagetitle');
foreach ($BikesSeries as $Series) {
// Ссылка на Серию
$Output .= '<h2><a href="/[~'.$Series['id'].'~]">'.$Series['pagetitle'].'</a></h2>';
// Получаем список мотоциклов Серии
$SeriesBikers = $modx->getActiveChildren($Series['id'], 'pagetitle');
$Output .= '<dl>';
foreach ($SeriesBikers as $Biker) {
$tvoutput = $modx->getTemplateVarOutput(array('moto_small_img','moto_seat_height', 'moto_displacement', 'moto_power', 'moto_year'), $Biker['id'], 1);
$Output .= '<dt><a href="/[~'.$Biker['id'].'~]" target="newWin" onclick="wo(\'/[~'.$Biker['id'].'~]\', 780, 500); return false;" title="'.strip_tags($Biker['pagetitle']).'">'.$Biker['pagetitle'].' ('.$tvoutput['moto_year'].')</a></dt>';
$Output .= '<dd><a class="pic" href="/[~'.$Biker['id'].'~]" title="'.$Biker['pagetitle'].'" target="newWin" onclick="wo(\'/[~'.$Biker['id'].'~]\', 780, 500); return false;"><img src="'.str_replace(" ", "%20", $tvoutput['moto_small_img']).'" width="118" height="79" alt="'.$Biker['pagetitle'].'" /></a><div class="description"><p>Высота по седлу: '.$tvoutput['moto_seat_height'].' мм.<br />Объём двигателя: '.$tvoutput['moto_displacement'].' см<sup>3</sup><br />Мощность двигателя: '.$tvoutput['moto_power'].' лс.</p></div></dd>';
}
$Output .= '</dl>';
}
return $Output;