File: //home/temp/yarusvl.ru/api/Links.php
<?php
require_once('Mgc.php');
class Links extends Mgc {
private $all_links_items;
private $links_items_tree;
private function init_links_items() {
$links_items = $this->links_items_tree = $this->all_links_items = array();
// Выбираем все элементы меню
$query = $this->db->placehold("SELECT
l.id,
l.parent_id,
l.name,
l.url,
l.is_target_blank,
l.visible,
l.position
FROM __links l
ORDER BY l.parent_id, l.position
");
$this->db->query($query);
$links = $this->db->results();
$tree = new stdClass();
$tree->submenus = array();
// Указатели на узлы дерева
$pointers = array();
$pointers[0] = &$tree;
$pointers[0]->path = array();
$pointers[0]->level = 0;
// Дерево элементов меню
$finish = false;
// Не кончаем, пока не кончатся элементы, или пока ниодну из оставшихся некуда приткнуть
while (!empty($links) && !$finish) {
$flag = false;
// Проходим все выбранные элементы
foreach ($links as $k => $item) {
if (isset($pointers[$item->parent_id])) {
// В дерево элементов меню (через указатель) добавляем текущий элемент
$pointers[$item->id] = $pointers[$item->parent_id]->submenus[] = $item;
// Путь к текущему элементу
$curr = $pointers[$item->id];
$pointers[$item->id]->path = array_merge((array)$pointers[$item->parent_id]->path, array($curr));
// Уровень вложенности элементов
$pointers[$item->id]->level = 1 + $pointers[$item->parent_id]->level;
// Убираем использованный элемент из массива
unset($links[$k]);
$flag = true;
}
}
if (!$flag) $finish = true;
}
// Для каждого элемента id всех его деток узнаем
$ids = array_reverse(array_keys($pointers));
foreach ($ids as $id) {
if ($id > 0) {
$pointers[$id]->children[] = $id;
if (isset($pointers[$pointers[$id]->parent_id]->children)) {
$pointers[$pointers[$id]->parent_id]->children = array_merge($pointers[$id]->children, $pointers[$pointers[$id]->parent_id]->children);
} else {
$pointers[$pointers[$id]->parent_id]->children = $pointers[$id]->children;
}
}
}
unset($pointers[0]);
unset($ids);
$this->links_items_tree[] = $tree->submenus;
$this->all_links_items = array_merge($this->all_menu_items, $pointers);
}
public function get_links_items_tree() {
if (!isset($this->links_items_tree)) {
$this->init_links_items();
}
return $this->links_items_tree;
}
public function get_links_items() {
if (!isset($this->menu_links_tree)) {
$this->init_links_items();
}
return $this->all_links_items;
}
public function add_link_item($link_item) {
$menu_item = (object)$link_item;
$this->db->query("INSERT INTO __links SET ?%", $link_item);
$id = $this->db->insert_id();
$this->db->query("UPDATE __links SET position=id WHERE id=?", $id);
if(!empty($result->description)) {
$this->languages->action_description($id, $result->description, 'menu_item');
}
unset($this->links_items_tree);
unset($this->all_links_items);
return $id;
}
public function update_link_item($id, $menu_item) {
$menu_item = (object)$menu_item;
$result = $this->languages->get_description($menu_item, 'menu_item');
$query = $this->db->placehold("UPDATE __links SET ?% WHERE id=? LIMIT 1", $menu_item, (int)$id);
$this->db->query($query);
unset($this->menu_links_tree);
unset($this->all_links_items);
return (int)$id;
}
public function delete_link_item($id) {
if(!empty($id)) {
$id = (int)$id;
$query = $this->db->placehold("DELETE FROM __links WHERE id=? LIMIT 1", $id);
$this->db->query($query);
}
return false;
}
public function autocomplete($search) {
}
}