| Новости | FAQ | Авторы | Документация | В действии | Библиотека |
| Инструменты | Полезные ссылки | Хостинги | Скачать | Примеры | Форум |
G_Z 02.02.2016 18:43 / 02.02.2016 18:48
Схема и данные:CREATE TABLE `_tree` ( `page_id` INT(10) UNSIGNED NOT NULL, `ancestor_id` INT(10) UNSIGNED NOT NULL, `distance` SMALLINT(5) UNSIGNED NOT NULL DEFAULT '0', PRIMARY KEY (`page_id`, `ancestor_id`, `distance`), INDEX `idx_ancestor_id` (`ancestor_id`), CONSTRAINT `fk_ancestor_id` FOREIGN KEY (`ancestor_id`) REFERENCES `_tree` (`page_id`) ON UPDATE CASCADE ON DELETE CASCADE ) COLLATE='utf8_general_ci' ENGINE=InnoDB ; INSERT INTO `_tree` (`page_id`, `ancestor_id`, `distance`) VALUES (0, 0, 0), (1, 0, 1), (1, 1, 0), (2, 0, 2), (2, 1, 1), (2, 2, 0), (3, 0, 2), (3, 1, 1), (3, 3, 0);Вывод:
@main[]
$root(1)
^connect[$SQL.connect-string]{
$tree[^table::sql{
SELECT t.page_id, p.ancestor_id AS parent_id
FROM _tree AS t
JOIN _tree AS p ON (p.page_id = t.page_id AND p.distance = 1)
WHERE t.ancestor_id = $root
}]
}
$tree[^tree.hash[parent_id][
$.type[table]
$.distinct(true)
]]
<style>
#tree div { border: 1px solid gray }
#tree div div { margin-left: 50px }
</style>
<div id="tree">
^print[$tree]
</div>
@print[tree;parent_id][locals]
$parent_id(^parent_id.int(0))
$children[$tree.$parent_id]
$result[]
^if($children){
$result[^children.menu{
<div>
<strong>$children.page_id</strong>
^print[$tree]($children.page_id)
</div>
}]
}Можно обойтись и без корневого элемента page_id = 0 и сэкономить одну связь на каждый элемент, но тогда нужно делать LEFT JOIN, IFNULL(ancestor_id, 0) AS ancestor_id и сложнее доставать всё дерево целиком.