Первое, что я создал для класса вложенных множеств это его интерфейс:
interface HierarchicalБлагодаря интерфейсу, иной класс, наследуя его может с легкостью заменить класс вложенных множеств.
{
public function build($object);
public function _getTree();
public function _getBranch($branch = 0);
public function _add($parent);
public function _delete($id);
public function _replace($parent,$id);
}
Сам класс выглядит так:
class NestedSet extends Doctrine_Record implements HierarchicalЗная, о том, что деревья могут содержать несколько рутовых веток или одну рут-ветку некоторые функции учитывают эту особенность.
{
public function build($object)
{
$this->iObject = $object;
$this->Object = Doctrine::getTable($this->TABLE_NAME)->getTree();
$this->hasManyRoots = $this->Object->getAttribute('hasManyRoots');
}
public function _getTree()
private function getChildren($item)
public function _getBranch($branch = 0)
public function _add($parent)
public function _delete($id)
public function _replace($parent,$id)
}
Функция получения Дерева в Nested set:
public function _getTree()Как видно из кода все ясно и понятно.
{
$this->TreeArray = array();
if ($this->hasManyRoots)
{
$rootColumnName = $this->Object->getAttribute('rootColumnName');
foreach ($this->Object->fetchRoots() as $root)
{
$options = array('root_id'=>$root->$rootColumnName);
foreach($this->Object->fetchTree($options)->toArray() as $node)
{
$this->TreeArray[$root->$rootColumnName][] = $node;
}
}
}
else
{
foreach ($this->Object->fetchTree()->toArray() as $node)
{
$this->TreeArray[$node['level']][] = $node;
}
}
return $this->TreeArray;
}
Особенности создания правильной структуры Nested Set, и как создавать Many Roots деревья используя Doctrine yaml в схемах, я опишу немного позже.
Вот основная функция, которая работают с деревом Nested Set в Symfony и в CodeIgniter используя PHP ORM Doctrine плагин. Сам класс получился довольно простым и дееспособным. Остальные функции, выложить не удалось из-за нечитабельного их расположения на страницах блога (код вылазит за границы страницы и надо его вручную подгонять, а мне лень).
Весь код класса я могу выложить сюда же в блог, по первому требованию девелоперов, для того, что бы сократить время затраченное на разработку тех или иных задач, в которых используется NestedSet.
Основную информацию по легкому созданию и управлению деревьями вы можете взять отсюда и написать свой собственный класс.
В дальнейшем я планирую написать легкое и доступное овервью как создавать деревья посредством Doctrine yaml схем, и как использовать SimpleTest в Doctrine для методики TDD.
Также хочу насторожить тех девелоперов, которые впервые работают с Nested Set. Переход от структуры смежных вершин к вложенному множеству влечет за собой некий дискомфорт ))).