ФорумРазработкаБазы данных → Вертикальное выпадающее меню из БД

Вертикальное выпадающее меню из БД

  • ChaoS

    Сообщения: 14 Репутация: N Группа: Кто попало

    Spritz 11 августа 2010 г. 9:14

    Нужно сделать меню вида:

    КАРАНДАШ
    красный
    синий
    РУЧКА
    ТЕТРАДЬ

    если ручка то

    КАРАНДАШ
    РУЧКА
    шариковая
    перо
    ТЕТРАДЬ

    если тетрадь то

    КАРАНДАШ
    РУЧКА
    ТЕТРАДЬ
    школьная
    общая

    и заранее неизвестно сколько будет подпунктов, т.е может быть так:

    КАРАНДАШ
    РУЧКА
    ТЕТРАДЬ
    школьная
    в клетку
    в линию
    общая


    где ТЕТРАДЬ - родитель записей школьная и общая, а школьная родитель записей в клетку и в линию ну и т.д.
    Подскажите пож-то скрипт на такое меню
  • Абырвалг

    Сообщения: 6480 Репутация: N Группа: Джедаи
  • Givi

    Сообщения: 2284 Репутация: N Группа: Адекваты

    Spritz 11 августа 2010 г. 10:17, спустя 58 минут 25 секунд

    ChaoS, мне вот этот список очень помог в свое время.
  • ChaoS

    Сообщения: 14 Репутация: N Группа: Кто попало

    Spritz 11 августа 2010 г. 13:14, спустя 2 часа 57 минут 22 секунды

    Ну вот есть функция построения дерева:

    function ShowTree ($parent) {
    $sql = "SELECT `num`, `parent`, `title` FROM `rubr` WHERE `parent` = $parent ORDER BY `title`";
    $result = mysql_query($sql);
    if (mysql_num_rows($result) > 0) {
    echo '<ul>';
    while ($row = mysql_fetch_array($result)) {
    echo '<li><a href="/?num='.$row['num'].'">'.$row['title'].'</a></li>';
    ShowTree ($row['num']);
    }
    echo '</ul>';
    }
    }

    ShowTree (0);


    можно ли это дерево как нибудь сворачивать и разворачивать,чтобы получилось меню подскажите пож-то
  • Givi

    Сообщения: 2284 Репутация: N Группа: Адекваты

    Spritz 11 августа 2010 г. 13:39, спустя 25 минут

    ChaoS, можно, мы не против.
  • Абырвалг

    Сообщения: 6480 Репутация: N Группа: Джедаи

    Spritz 11 августа 2010 г. 13:43, спустя 3 минуты 29 секунд

  • Givi

    Сообщения: 2284 Репутация: N Группа: Адекваты

    Spritz 11 августа 2010 г. 14:37, спустя 54 минуты 11 секунд

    Абырвалг, это баян, он сворачивается и разворачивается =)))
    А вообще хз что именно хочет ТС, но думаю что для начала ему достаточно сделать простое полностью открытое меню, ибо один хрен указанную выше функцию ещё дорабатывать нужно (дабы сократить кол-во запросов к БД до одного). А раскрывашки/закрывашки он уже со временем будет делать.

    п.с. Говорю так от того, что практически сам (как минимум поиском пользовался сам) смог сделать "постоянно-октрытое" меню в виде дерева. И вопросы по дереву задавать начал лишь тогда, когда возникла необходимость сократить кол-во запросов к БД + сделать раскрывающееся субменю при выборе родителя. Так что пусть с этим разберется нормально.
  • ChaoS

    Сообщения: 14 Репутация: N Группа: Кто попало

    Spritz 12 августа 2010 г. 9:02, спустя 18 часов 25 минут 20 секунд

    ППц и как сделать чтобы запросов меньше было?
    Спустя 69 сек.
    и вообще зачем делать меньше запросов? на что это влияет?
  • Troy

    Сообщения: 2532 Репутация: N Группа: Джедаи

    Spritz 12 августа 2010 г. 9:03, спустя 37 секунд

    ChaoS, Nested Sets это 1 запрос
  • Givi

    Сообщения: 2284 Репутация: N Группа: Адекваты

    Spritz 12 августа 2010 г. 10:11, спустя 1 час 7 минут 51 секунду

    ChaoS, на скорость работы скрипта и на нагрузку на сервер. Если на сайте будет сидеть одновременно порядка 100 людей. то сервер начнет тормозить ужасно, а то и вовсе "ляжет" под неоптимизированными скриптами. Как сделать одним запросом: выбирай все. что тебе нужно одним запросом и складывай это все дело в правильно-структуризированный массив.

    .Troy, НС ему очень рано. Да и в его случае вполне достаточно будет списков смежности. Просто нужно делать выборку в массив и уже с массивом работать как тебе удобно. У меня этот массив (с одного единственного запроса) идет на построение меню, построение "хлебных крошек" и ещё на некоторые мелочи, которые по сути нужны только мне и только в данном проекте.
  • pasha

    Сообщения: 1048 Репутация: N Группа: Адекваты

    Spritz 12 августа 2010 г. 12:32, спустя 2 часа 21 минуту 7 секунд


    ChaoS, мне вот этот список очень помог в свое время.

    ChaoS, тебе же дали уже где копать

    Это еще посмотри http://php.russofile.ru/ru/authors/sql/nestedsets01/
  • ChaoS

    Сообщения: 14 Репутация: N Группа: Кто попало

    Spritz 12 августа 2010 г. 13:10, спустя 37 минут 58 секунд

    Ну а как нить без всего этого можно обойтись? тогда вот так вот функция:


    $queryresult = mysql_query('SELECT num, parent, title FROM rubr ORDER BY parent, num');

    while ($row = mysql_fetch_assoc($queryresult)) {
    $v_arr[$row['parent']][$row['num']] = $row['title'];
    }

    $v_tree=array();

    function built_tree($arr,&$tree,$par_id=-1)
    { for($i=0;$i<count($arr);$i++)
    { if($arr[$i]['parent']==$par_id)
    { if(is_array($tree))
    { $tree[$arr[$i]['ID']]=null; }
    else { $tree=array();
    $tree[$arr[$i]['ID']]=null;
    }
    built_tree($arr,$tree[$arr[$i]['ID']],$arr[$i]['ID']);
    }
    else {}
    }
    }


    на выводе вот такая вещь получается:

    Array
    (
    [0] => Array
    (
    [208] => Пункт 1
    [209] => Пункт 2
    [210] => Пункт 3
    )

    [208] => Array
    (
    [211] => Пункт 1.1
    [212] => Пункт 1.2
    )


    [209] => Array
    (
    [216] => Пункт 2.1
    [217] => Пункт 2.2
    [251] => Пункт 2.3
    )

    [210] => Array
    (
    [218] => Пункт 3.1
    [219] => Пункт 3.2
    )

    [211] => Array
    (
    [221] => Пункт 1.1.1
    [222] => Пункт 1.1.2

    )
    ) и т.д ,т.е. массив что то типо наподобие дерева, можно его как нибудь отсортировать, чтобы получилось так:

    [208] => Пункт 1
    [211] => Пункт 1.1
    [221] => Пункт 1.1.1
    [222] => Пункт 1.1.2
    [212] => Пункт 1.2
    [209] => Пункт 2
    [210] => Пункт 3 и т.д.
  • pasha

    Сообщения: 1048 Репутация: N Группа: Адекваты

    Spritz 12 августа 2010 г. 13:12, спустя 2 минуты 26 секунд

    ChaoS, я бы сказал да не матюгаюсь :)
    зачем усложнять? скачай что я тебе посоветовал, посмотри. Там хорошо реализованный класс, есть демо примеры. Правильно реализовано удаление детей/ родителей, перемещение детей/ родителей.
  • Givi

    Сообщения: 2284 Репутация: N Группа: Адекваты

    Spritz 12 августа 2010 г. 14:09, спустя 56 минут 14 секунд

    Pasha, дума. ему оно не нужно, ибо НестедСетс реально сложная для понимания фишка, если опыта с деревьями нет совсем. Хотя класс отличный, спорить не стану.

    ChaoS, ну все правильно нашел. Осталось только сделать вывод менюшки правильно. Подумай немного, ведь по сути у тебя уже есть готовый оптимизированный массив, теперь только указывай ему нужные тебе ключи и циклов выведешь все дерево.

Пожалуйста, авторизуйтесь, чтобы написать комментарий!