Gad555
@Gad555
Только учусь

Как вывести дерево категорий?

Всем привет, вывожу дерево категорий в таком формате:

5aa689b26c2f5030850359.png
Мой код:
// Получение Категорий из БД


    //Устанавливаем кодировку и вывод всех ошибок
    header('Content-Type: text/html; charset=UTF-8');
    error_reporting(E_ALL);

    //Объектно-ориентированный стиль
    $mysqli = new mysqli($db_host, $db_user, $db_pass, 'vhis');

    //Устанавливаем кодировку utf8
    $mysqli->query("SET NAMES 'utf8'");

    /*
     * Это "официальный" объектно-ориентированный способ сделать это
     * однако $connect_error не работал вплоть до версий PHP 5.2.9 и 5.3.0.
     */
    if ($mysqli->connect_error) {
        die('Ошибка подключения (' . $mysqli->connect_errno . ') '
                . $mysqli->connect_error);
    }

    /*
     * Если нужно быть уверенным в совместимости с версиями до 5.2.9,
     * лучше использовать такой код
     */
    if (mysqli_connect_error()) {
        die('Ошибка подключения (' . mysqli_connect_errno() . ') '
                . mysqli_connect_error());
    }

    //Получаем массив нашего меню из БД в виде массива
    function getCat($mysqli){
        $sql = 'SELECT * FROM `cat`';
        $res = $mysqli->query($sql);

        //Создаем масив где ключ массива является ID меню
        $cat = array();
        while($row = $res->fetch_assoc()){
            $cat[$row['id']] = $row;
        }
        return $cat;
    }

    //Функция построения дерева из массива от Tommy Lacroix
    function getTree($dataset) {
        $tree = array();

        foreach ($dataset as $id => &$node) {    
            //Если нет вложений
            if (!$node['parent']){
                $tree[$id] = &$node;
            }else{ 
                //Если есть потомки то перебераем массив
                $dataset[$node['parent']]['childs'][$id] = &$node;
            }
        }
        return $tree;
    }

    //Получаем подготовленный массив с данными
    $cat  = getCat($mysqli); 

    //Создаем древовидное меню
    $tree = getTree($cat);

    //Шаблон для вывода меню в виде дерева
    function tplMenu($category,$str)
     {   
        if($category['parent'] == 0){
           $menu = '<option value="'.$category['id'].'">'.$category['name'].'</option>';
        }else{   
           $menu = '<option value="'.$category['id'].'">'.$str.' '.$category['name'].'</option>';
        }

        if(isset($category['childs'])){
            $i = 1;
            for($j = 0; $j < $i; $j++){
                $str .= '_';
            }         
            $i++;

            $menu .= showCat($category['childs'], $str);
        }
        return $menu;
     }

    /**
    * Рекурсивно считываем наш шаблон
    **/
    function showCat($data, $str){
        $string = '';
        $str = $str;
        foreach($data as $item){
            $string .= tplMenu($item, $str);
        }
        return $string;
    }

    //Получаем HTML разметку
    $cat_menu = showCat($tree, '');

    //Выводим на экран
    echo '<select class="row-item-2"><option value="0">Выбери '. $cat_menu .'</select>';
    ?>


Подскажите, пожалуйста, как отобразить в таком формате?
5aa689ffcc768937389863.gif
  • Вопрос задан
  • 1896 просмотров
Пригласить эксперта
Ответы на вопрос 1
webinar
@webinar Куратор тега PHP
Учим yii: https://youtu.be/-WRMlGHLgRg
Сформировать в php json, обрабатывать в js событие изменения в select, добавлять новый select c option-сами на базе этого json. Если списки большие есть смысл при изменения в select делать ajax и получать нужный json асинхронно.
Можно взять готовое решение, их миллион, например:
https://github.com/kartik-v/dependent-dropdown
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы