6.4 Работа с древовидными структурами
Для хранения и работы с древовидными структурами используется класс dbTreeNS. Этот класс обеспечивает работу с деревьями по технологии Nested Sets. Причём в одной таблице со структурой дерева может храниться несколько деревьев.В работе используется 2 таблицы, назовем их условно - tree и data.
-
data- в таблице хранятся данные. Структура и описание таблицы:parent - идентификатор записи, связан с полем tree.id foo - хранимое значение path - путь до записи в дереве.
Для связи с таблицей содержащей структуру, возможно заведение отдельного поля.
Но учитывая 1:1 отношение между записями таблицы данных и структурной таблицей рациональнее использовать праймари ключи таблиц для связи. -
tree- таблица используется для хранения структуры
Структура и описание таблицы:id - идентификатор записи lkey - левый ключ rkey - правый ключ level - уровень узла в дереве (root - первый уровень)
Вся работа с деревьями осуществляется через simpleMapperForTree и доменные объекты типа simpleForTree. simpleMapperForTree предоставляет следующие методы:
setTree($tree_id)- метод установки id дерева. Используется, когда в вышеописанном наборе таблиц хранится несколько деревьев.searchByPath($path)- поиск элемента по пути.getFolders(simpleForTree $id, $level = 1)- является синонимом для методаgetBranch().getBranch(simpleForTree $id, $level = 1)- выборка наследников. Первым аргументом передаётся искомый узел, а вторым - глубина выборки.getParentBranch(simpleForTree $node)- выборка родительской ветки.getTreeParent(simpleForTree $child)- выборка родительского элемента.
Остальные методы этого класса наследуются от simpleMapper'a.
У класса simpleForTree есть следующие методы для работы с деревьями:
getTreeLevel()- уровень узла.getTreeKey()- значение первичного ключа узла.getTreeId()- id дерева, в случае когда в наборе таблиц хранятся несколько деревьев.getTreeParent()- получение родительского элемента текущего узла.getPath($simple = true)- получение пути до узла. Единственный аргумент принимает булево значение, в случаеtrue- возвращается "простой" путь, у которого убирается имя корневого элемента,false- полный путь.
В остальном работа с классом simpleForTree аналогична работе с любым наследником класса simple.
Настройка дерева производится с помощью переопределения метода simpleMapperForTree::getTreeParams(), который по умолчанию возвращает массив следующего вида:
protected function getTreeParams() { return array('nameField' => 'name', 'pathField' => 'path', 'joinField' => 'parent', 'tableName' => $this->table . '_tree', 'treeIdField' => 'tree_id'); }
В наследнике данный метод может возвращать массив, содержащий лишь часть ключей, в этом случае недостающие значения будут использованы из массива по умолчанию. Ключи в этом массиве обозначают следующее:
nameField- поле, содержащее в себе имя узла.pathField- поле, содержащее в себе путь до узла. Путь строится и модифицируется автоматически, используя данные поляnameFieldjoinField- поле, связывающее таблицу данных с таблицей структуры.tableName- имя таблицы, хранящей структуру дерева.treeIdField- имя поля, в котором будет храниться id дерева (в случае, когда деревьев несколько).