0

再帰関数を使用してサイトメニューを作成するというアイデアを本当に掘り下げていますが、問題が発生していて、何年も前から頭を悩ませています。ネストされたリストを返すためにメニュー関数が必要ですが、ツリーの非アクティブな関連要素を表示したくありません。

詳細。私は、navアイテムの通常のフィールド(target、link_text、titleなど)のすべてと、各アイテムの一意のID、そして重要なのはparent_idを格納するmenu_itemsというテーブルを持つMySqlデータベースを持っています。

しかし、これはすべて議論の余地があります。たとえば、この情報を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または名前のいずれかをメニュー関数に渡します。

誰かアイデアはありますか?私はしばらくの間壁に頭をぶつけてきました:-)

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 に答える