Генерация вложенного дерева с полными путями (URL) и значениями из базы данных - PullRequest
1 голос
/ 04 октября 2011

Я работаю над этим вопросом со вчерашнего дня.Более конкретно - у меня есть некоторые значения в базе данных, которые выглядят следующим образом:

____________________________________
| id | parentId |   name   |  url  |
------------------------------------
| 1  |     0    | Nieuws   | url_1 |
------------------------------------
| 2  |     0    | Reviews  | url_2 |
------------------------------------
| 3  |     0    | Meuk     | url_3 |
------------------------------------
| 4  |     1    | Games    | url_4 |
------------------------------------
| 5  |     1    | Internet | url_5 |
------------------------------------
| 6  |     5    | Browsers | url_6 |
------------------------------------

Я хотел бы видеть сгенерированное дерево на основе этих значений.Форма цели должна выглядеть следующим образом:

<ul>
    <li><a href="url_1">Nieuws</a>
        <ul>
            <li><a href="url_1/url_4">Games</a></li>
            <li><a href="url_1/url_5">Internet</a>
                <ul>
                    <li><a href="url_1/url_5/url_6">Browsers</a></li>
                </ul>
            </li>
        </ul>
    </li>
    <li><a href="url_2">Reviews</a></li>
    <li><a href="url_3">Meuk</a></li>
</ul>

Для меня важно иметь все косые черты внутри дерева (полный путь со всеми родителями и детьми).

Я хотел бы добавить, что я нашел код на этой странице: http://crisp.tweakblogs.net/blog/317/formatting-a-multi-level-menu-using-only-one-query.html, но я не могу повторить его таким образом, как описано выше.Я буду очень благодарен за любую помощь, потому что крайний срок подачи заявок очень быстро приближается: (

Ответы [ 2 ]

0 голосов
/ 04 октября 2011

Только одна модификация. Я думаю, что этот способ намного проще. Вместо того, чтобы использовать массив для хранения URL, я передаю строку в качестве аргумента (содержащую базовый URL).

// menu builder function, parentId 0 is the root 
function buildMenu($parentId, $menuData, $urlRoot) 
{ 
    $html = ''; 

    if (isset($menuData['parents'][$parentId])) 
    {
    $html = '<ul>'; 
    foreach ($menuData['parents'][$parentId] as $itemId) 
    { 
        $url   = $urlRoot . $itemId['url'] . '/';
        $html .= '<li><a href="$url">' . $menuData['items'][$itemId]['name'] . '</a>'; 

        // find childitems recursively 
        $html .= buildMenu($itemId, $menuData, $url); 

        $html .= '</li>'; 
    } 
    $html .= '</ul>'; 
    } 

    return $html; 
} 

// output the menu 
echo buildMenu(0, $menuData, '');
0 голосов
/ 04 октября 2011

в зависимости от функции в вашей ссылке, если вы добавите URL-адрес в запрос, должно сработать что-то вроде этого:

<?php
// menu builder function, parentId 0 is the root
function buildMenu($parentId, $menuData, $nodes=false)
{
    $html = '';

    if (isset($menuData['parents'][$parentId]))
    {
        $html = '<ul>';
        if($nodes === false){
            $nodes = array();
        } elseif(!is_array($nodes)) {
            $nodes = array($nodes);
        } else {
            $nodes[] = $menuData['items'][$parentId]['url'];
        }
        foreach ($menuData['parents'][$parentId] as $itemId)
        {
            $html .= '<li><a href="/' . implode('/', $nodes) . '">';
            $html .= $menuData['items'][$itemId]['name'] . '</a>';

            // find childitems recursively
            $html .= buildMenu($itemId, $menuData, $nodes);

            $html .= '</li>';
        }
        $html .= '</ul>';
        array_pop($nodes);
    }

    return $html;
}

// output the menu
echo buildMenu(0, $menuData);
?>
...