HEX
Server: Apache/2.4.6 (CentOS) mpm-itk/2.4.7-04 mod_fcgid/2.3.9 PHP/5.4.16
System: Linux dvm.vladweb.ru 3.10.0-1160.119.1.el7.x86_64 #1 SMP Tue Jun 4 14:43:51 UTC 2024 x86_64
User: region-gk.ru (1016)
PHP: 7.3.33
Disabled: NONE
Upload Files
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) {

    }
}