Бесконечные подкатегории

Тема в разделе "Как сделать...", создана пользователем NiceBro, 23 дек 2013.

  1. NiceBro

    NiceBro Создатель

    Регистр.:
    2 ноя 2012
    Сообщения:
    44
    Симпатии:
    25
    Мне надо организовать странички с бесконечной вложенностью например: site.com/page1/page2/page3/....../page10..
    Подскажите организацию полей в БД и как можно сделать вывод списка этих страниц с учетом иерархии родителей и потомков.
     
  2. RastaMace

    RastaMace Писатель

    Регистр.:
    4 июл 2012
    Сообщения:
    0
    Симпатии:
    0
    поля 'id', 'parent_id', ... + рекурсивная выборка, если Postgresql, то там можно рекурсию в запросе организовать
     
  3. RORC

    RORC

    Регистр.:
    14 июн 2013
    Сообщения:
    171
    Симпатии:
    41
    не ясно зачем такая вложенность, при рекурсии достаточно прилично теряем на каждом уровне на просчет пути

    Можно сразу сохранять полный путь и родительскую категорию.

    Таблица примерно такая:

    Код:
    ИД, Название, Родитель, Полный просчитанный путь URL, Полный просчитанный путь навигационной цепочки (Хлебных крошек)
    Тем самым сохраняем высокую производительность и получаем внешне тоже самое.

    Если напишите зачем такая вложенность, тогда можно описать подробнее возможные алгоритмы решения.
     
  4. hamann11

    hamann11 Создатель

    Регистр.:
    19 ноя 2008
    Сообщения:
    48
    Симпатии:
    13
    Тут зависит - может ли одна страничка быть в разных уровнях вложенности. если нет то самый простой вариант - зафигачить в таблице с этими страничками колонку путь (например route), и там писать какую угодно вложенность. Ну и при заходе по некоему адресу просто проверять нет ли такой странички с похожим путем. если нету - уже стандартный обработчик юзать. Если есть закономеронсть форирования этой ссылки - то и связи прямо можно не указывать в бд, а все взвалить на php чтоб само считало. быстрее будет чем рекурсию такую тулить.
     
    RORC нравится это.
  5. Wounderer

    Wounderer Создатель

    Регистр.:
    11 янв 2007
    Сообщения:
    21
    Симпатии:
    6
    Бесконечено ничего не получится постольку поскольку
    а) Существуют ограничения на длину строки в браузере
    б) Существуют ограничения на количество рекурсивных вызовов функции (и если каждый раз будет вызываться sql запрос, то ограничение окажется существенным)

    Но если уж очень надо то:

    1) Как было сказано "поля 'id', 'parent_id'" в БД.
    2) Выбираем ВСЕ строки таблицы и храним в массиве
    3) Рекурсивно обходим массив (while !is_null($parent_id)) и проделываем нужную операцию

    Рекомендую - Передавать большой массив со всеми категориями по ссылке (&$my_big_arr) и все же установить дополнительный лимит на вложенность.. Хотя бы 255 =)
     
  6. NiceBro

    NiceBro Создатель

    Регистр.:
    2 ноя 2012
    Сообщения:
    44
    Симпатии:
    25
    Спасибо за ответы. Бесконечная вложенность это было образно, ограничение рекурсивной функции по моему 100 вызовов. Мне надо было максимально неограниченная вложенность :) Ясно что никто не будет делать 100 под-категорий. Сохранение пути в отдельное поле бд, я считаю это самым лучшим решение так как выполняется всего 1 запрос в бд. Ну и кому интересно вот построение списка страниц с учетом иерархии.
    PHP:
    <?php

    //$pages = mysql_query('SELECT id, parent, slug FROM pages')

    $pages = array(
        
    => array('id' => 0'parent' => NULL'slug' => 'page1'),
        
    => array('id' => 1'parent' =>    0'slug' => 'page2'),
        
    => array('id' => 2'parent' =>    1'slug' => 'page3'), 
        
    => array('id' => 3'parent' =>    2'slug' => 'page4'),
        
    => array('id' => 4'parent' =>    2'slug' => 'page5'),
        
    => array('id' => 5'parent' =>    3'slug' => 'page6'),
        
    => array('id' => 6'parent' =>    1'slug' => 'page7'),
        
    => array('id' => 7'parent' =>    1'slug' => 'page8'),
        
    => array('id' => 8'parent' =>    3'slug' => 'page9'),
        
    => array('id' => 9'parent' =>    7'slug' => 'page10'),
        
    10 => array('id' => 10'parent' =>    5'slug' => 'page11'),
    );

    foreach(
    $pages as &$page) {
        if(!
    is_null($page['parent'])) {
            
    $pages[$page['parent']]['childs'][$page['id']] = &$page;
        }
    }

    foreach(
    $pages as $id => &$page) {
        if(!
    is_null($page['parent'])) {
            unset(
    $pages[$id]);
        } 
    }

    function 
    hierarchy($pages) {
        echo 
    '<ul>';
        foreach(
    $pages as $page) {
            echo 
    '<li>';
            echo 
    $page['slug'];
            if(!empty(
    $page['childs'])) {
                
    hierarchy($page['childs']);
            } 
            echo 
    '</li>';
        }
        echo 
    '</ul>';
    }

    hierarchy($pages);
     
    RORC нравится это.
  7. runyugin

    runyugin Постоялец

    Регистр.:
    30 июн 2013
    Сообщения:
    54
    Симпатии:
    4