Ну, это очень просто.Просто получите дерево с нужными вам отношениями следующим образом:
class ModelTable extends Doctrine_Table
{
/**
* Gets tree element in one query
*/
public function getModelTree()
{
$q = $this->createQuery('g')
->leftJoin('g.Tags t')
->orderBy('g.root_id')
->addOrderBy('g.lft')
->where('g.root_id NOT NULL')
;
return $q->execute(array(), Doctrine_Core::HYDRATE_ARRAY_HIERARCHY);
}
}
Затем вы можете отобразить его следующим образом:
<?php function echoNode($tree, $parent=null) { ?>
<ul>
<?php foreach ($tree as $node): ?>
<li data-property='<?php echo false != $node['property'] ? $node['property'] : $parent['property'] ?>'>
<?php echo $node['name'] ?>
<?php if (count($node['__children']) > 0): ?>
<?php echo echoNode($node['__children'], $node) ?>
<?php endif; ?>
</li>
<?php endforeach; ?>
</ul>
<?php } ?>
<?php echo echoNode($tree) ?>
Обратите внимание, как вы можете получить «свойство» у родителя.узел, если он отсутствует.Другой способ решения этой проблемы - использовать Doctrine_Core :: HYDRATE_RECORD_HIERARCHY.Это позволяет использовать для вызова методов на $ узлах при цикле.Вы можете создать метод Model :: getClosestProperty (), например, чтобы получить свойство от ближайшего родителя.Но это не так эффективно, как увлажнение массива.