0

我真的很想使用递归函数来构建我的站点菜单,但是我遇到了一个问题,并且已经困扰我很久了。我需要我的菜单函数来返回一个嵌套列表,但我不希望显示树的非活动无关元素。

细节。我有一个 MySql 数据库,其中包含一个名为 menu_items 的表,该表存储导航项目(目标、链接文本、标题等)的所有常用字段以及每个项目的唯一 ID,重要的是 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>

显然,我会将当前页面的 ID 或名称传递给 Menu 函数。

有什么想法吗?我已经把头撞在墙上有一段时间了:-)

4

1 回答 1

0

这是我的完整方法,其中数据库具有页面 ID、父 ID、链接(永久链接)和标题;希望能帮助到你。

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;
    }
}
于 2011-07-07T10:52:02.293 回答