PHP рекурсивная функция для создания навигации сайта в виде вложенного списка, но без лишних пунктов меню - PullRequest
0 голосов
/ 04 августа 2010

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

подробности. У меня есть база данных MySql с таблицей menu_items, в которой хранятся все обычные поля для элемента навигации (target, link_text, title и т. Д.), А также уникальный идентификатор для каждого элемента и, что важно, parent_id.

Это все для обсуждения, хотя, например, было бы легче сохранить эту информацию в файле XML?

Например, вот пример меню со всеми показанными элементами:

<ul>
    <li><a href="1.html">link 1</a>
        <ul>
            <li><a href="1-1.html">link 1-1</a>
            <li><a href="1-2.html">link 1-2</a>
        </ul>
    </li>
    <li><a href="2.html">link 2</a>
        <ul>
            <li><a href="2-1.html">link 2-1</a>
            <li><a href="2-2.html">link 2-2</a>
        </ul>
    </li>
    <li><a href="3.html">link 3</a></li>
</ul>

Но если текущая страница, например, 1-2.html, я хочу, чтобы у меня было такое меню:

<ul>
    <li><a href="1.html">link 1</a>
        <ul>
            <li><a href="1-1.html">link 1-1</a>
            <li><a href="1-2.html">link 1-2</a>
        </ul>
    </li>
    <li><a href="2.html">link 2</a></li>
    <li><a href="3.html">link 3</a></li>
</ul>

Очевидно, я бы передал либо идентификатор, либо имя текущей страницы в функцию меню.

Есть идеи у кого-нибудь? Я уже некоторое время бьюсь головой о стену: -)

1 Ответ

0 голосов
/ 07 июля 2011

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

function make_nav($current_page_id)
{
    nav_rec(0, $current_page_id, constant('SITE_URL'), 0);
}

function nav_rec($page, $current_page_id, $link, $level)
{   
    if (!$page)
    {
        $page = array();
        $page['page_id'] =  '0';
    }
    else
    {
        ?><a class="nav-link nav-level-<?= $level ?>" href="<?= $link ?>"><?= $page['title'] ?></a><?
    }

    // Checks for the subpages from this page.  
    $page_q = "
        SELECT id AS page_id, parent_id, permalink, page_title AS title 
        FROM ".constant('MYSQL_PREFIX')."pages 
        WHERE `page_type` = 'page'
        AND `in_nav` = '1'
        AND `status` = 'published'
        AND `is_deleted` = '0'
        AND `parent_id` = '".$page['page_id']."'";

    if ($page_rs = mysql_query($page_q))
    {
        if (mysql_num_rows($page_rs))
        {
            while($page = mysql_fetch_assoc($page_rs))
            {
                nav_rec($page, $current_page_id, $link . $page['permalink'].'/', $level+1);
            }
        }
        else
        {
            $level = 0;
        }
    }
    else
    {
        $level = 0;
    }
}
...