具有无限子菜单/项目的数据库菜单?

时间:2018-02-09 21:07:17

标签: php mysql mysqli

我正在尝试构建此功能,以显示包含数据库子菜单的菜单。可以显示子子菜单等的东西......如果那是我需要的东西。

enter image description here

在数据库中,我有2个表,menumenuItem

菜单

enter image description here

菜单项

enter image description here

php文件

function get_menu($id) {

require(dirname(__FILE__) . '/config.php');

// main base
$menu = "   SELECT id, menu_name, menu_data, menu_order
            FROM mos_menuItem 
            WHERE menu_parent_id='$id' 
            AND menu_sub='0' 
            ORDER BY menu_order";
$menuResult = mysqli_query($conn, $menu);

echo '<ul>';

while ($menuRow = mysqli_fetch_row($menuResult)) {
    // main menu
    echo '<li><a href="'. $menuRow[2] .'" class="menu-item parent-menu">'. $menuRow[1] .'</a></li>';

        // sub base
        $sub = "SELECT id, menu_name, menu_data, menu_order, menu_sub 
                    FROM mos_menuItem 
                    WHERE menu_parent_id='$menuRow[0]' 
                    AND menu_sub>='1' 
                    ORDER BY menu_order";
        $subResult = mysqli_query($conn, $sub);

        echo '<ul>';

        while ($subRow = mysqli_fetch_row($subResult)) {
            echo '<li><a href="'. $subRow[2] .'" class="menu-item sub-menu">'. $subRow[1] .'</a></li>';
        }   

        echo '</ul>';
}
echo '</ul>';

mysqli_close($conn);
}

所以我需要在自己内部循环一些东西?我不知道从哪里开始。

2 个答案:

答案 0 :(得分:1)

递归是你最好的朋友。

我不确定menu_sub字段的用途是什么。我假设它告诉你它在菜单层次结构中的级别。如果是这种情况,那么您可以安全地忽略它(menu_parent_id就足够了)来创建这个多级菜单层次结构。

function getMenus($menu_id, $is_sub=false){
   $sql = "SELECT id, menu_name, menu_data, menu_order
        FROM mos_menuItem 
        WHERE menu_parent_id='$menu_id' 
        ORDER BY menu_order";
   $mResult = mysqli_query($conn, $sub);
   echo '<ul>';

   while ($mRow = mysqli_fetch_row($mResult)) {
       echo '<li><a href="'. $mRow[2] .'" class="menu-item '.($is_sub ? 'sub-menu' : '').'">'. $mRow[1] .'</a>';
        getMenus($mRow[0], true);
        echo '</li>';
    }  
    echo '</ul>';
}

这有一个缺点,如果您希望层次结构从0以外的父级开始(我假设您的根menu_id为0),则该特定菜单不会显示在层次结构中。

答案 1 :(得分:0)

所以经过一些试验和错误后我才弄明白。看看Sheikh Azad代码真的很有帮助。 唯一的区别在于我的函数我有AND menu_sub='$sub',如果id是相同的话,它不会循环主菜单项。如果这是有道理的。

功能

function mos_get_menu_editor($menuId, $sub) {

    require(dirname(__FILE__) . '/config.php');

    $item = "   SELECT id, menu_name, menu_data, menu_order, menu_sub
                FROM mos_menuItem 
                WHERE menu_parent_id='$menuId' 
                AND menu_sub='$sub' 
                ORDER BY menu_order";
    $itemResult = mysqli_query($conn, $item);

        echo '<ul>';

        while ($itemRow = mysqli_fetch_row($itemResult)) {

            echo '<li><a href="'. $itemRow[2] .'" class="menu-item ' .($sub ? 'sub-menu' : '').'">'. $itemRow[1] .'</a></li>';

                mos_get_menu_editor($itemRow[0], 1);

        }
        echo '</ul>';

    mysqli_close($conn);
}