Нужен совет по Дерево каталогов NESTED SETS (вложенные множества)

Тема в разделе "PHP", создана пользователем trooll, 23 июн 2012.

Модераторы: latteo
  1. trooll

    trooll PHP кодер

    Регистр.:
    22 дек 2008
    Сообщения:
    503
    Симпатии:
    116
    Приветсвую.

    Таки решился взяться основательно за написание своей CMS, необходима помощь советом по сабжу. Собственно интересует готовый, проверенный класс для работы с Деревом каталогов по принципу NESTED SETS (вложенные множества).

    Информация по NESTED SETS если кому на слух тяжеловато вспомнить что это:
    http://www.getinfo.ru/article610.html

    Обязательные требования:
    1) Базы MySQL
    2) PDO или обычный синтаксис запросов MySQL
    3) Желательно что бы класс не тянул за собой хвост из множества дополнительных классов необходимых для работы этого класса
     
    latteo нравится это.
  2. morine

    morine Создатель

    Регистр.:
    11 фев 2012
    Сообщения:
    28
    Симпатии:
    9
    Из тяжелой артиллерии - Doctrine
    А если что по легче то есть nstrees или baobab

    У всех свои плюсы и минусы, а если вы уж свою CMS пишите то почему же самим не написать класс по работе с nested tree с нужным именно вам функционалом?
     
  3. SiZE

    SiZE Постоялец

    Регистр.:
    31 янв 2010
    Сообщения:
    51
    Симпатии:
    10
    я этим пользуюсь
     
  4. zaxap83

    zaxap83 Постоялец

    Регистр.:
    6 дек 2010
    Сообщения:
    87
    Симпатии:
    28
    Всегда пользовался таким методом:

    PHP:
    function show_menu($id$curr)
    {
        
    $tree_query mysql_query("SELECT * FROM categories WHERE parent_id=$id");
        while (
    $menu_tree mysql_fetch_assoc($tree_query))
            {
                
    $res mysql_query("SELECT * FROM categories WHERE parent_id='".$menu_tree['categories_id']."'");
                if(
    mysql_num_rows($res)>0)
                    {
                        
    $has_sub true;
                    }
                else
                    {
                        
    $has_sub false;
                    }
                
    $check mysql_fetch_row($res);
                if (
    $check == true)
                    {
                        if(
    $menu_tree['categories_id'] == $curr)
                            {
                                echo 
    "<li class='curr'><a href='/index.php?catid=".$menu_tree['categories_id']."'>".$menu_tree['cat_name']."</a>";
                            }
                        else
                            {
                                echo 
    "<li><a href='/index.php?catid=".$menu_tree['categories_id']."'>".$menu_tree['cat_name']."</a>";
                            }
                        if (
    $has_sub)
                            {
                                echo 
    "<ul>";
                            }
                        else
                            {
                                echo 
    "</li>";
                            }
                        
    show_menu($menu_tree['categories_id'], $curr);
                        echo 
    "</ul></li>";
                    }
                else
                    {
                        if(
    $menu_tree['categories_id'] == $curr)
                            {
                                echo 
    "<li class='curr'><a href='/index.php?catid=".$menu_tree['categories_id']."'>".$menu_tree['cat_name']."</a>";
                            }
                        else
                            {
                                echo 
    "<li><a href='/index.php?catid=".$menu_tree['categories_id']."'>".$menu_tree['cat_name']."</a>";
                            }
                        if (
    $has_sub)
                            {
                                echo 
    "<ul>";
                            }
                        else
                            {
                                echo 
    "</li>";
                            }
                        
    show_menu($menu_tree['categories_id'], $curr);
                        if (
    $has_sub) echo "</ul>";
                    }
            }
            return;
     
    }
    if(isset(
    $_GET['catid']) && $_GET['catid'] !='')
        {
            
    $curr $_GET['catid'];
        }
    else
        {
            
    $curr $_GET['catid'];
        }

    Это можно сказать демонстрационный вариант, обычно вместо вывода формирую массив, а там уже по потребностям.
     
  5. vhome

    vhome Создатель

    Регистр.:
    6 авг 2012
    Сообщения:
    37
    Симпатии:
    35
    Вот например неплохой класс