多级子菜单代码点火器


Multilevel submenu codeigniter

我必须将现有菜单扩展到多级菜单。我很难理解,所以我希望有人能帮我。

  1. 首先,我在数据库中添加了另一个名为parent_id的表。

  2. 然后我想看看这一列是否填写完毕,因此大于>0。

  3. 当然,然后检查id是否为parent_id。

若有的话,我想在父项悬停时显示我的子菜单。

我目前的菜单是多语言菜单。

这是我目前的型号:

var $default_order_by = array('position');
function findView($page)
{
    $language = $this->config->item('language');
    $p = new Page();
    $p->where('url_' . $language, $page)->get();
    return $p->view;
}
function findPageMenu($page)
{
    $language = $this->config->item('language');
    $p = new Page();
    $p->where('url_' . $language, $page)->get();
    return $p->menu;
}
function findAllByView()
{
    $pages = new Page();
    $result = array();
    foreach ($pages->get() as $page)
        $result[$page->view] = $page;
    return $result;
}
function getMenu()
{
    $pages = new Page();
    if ($this->session->userdata('is_admin'))
        return $pages->where('position >', 0)->get();
    else
        return $pages->where('position >', 0)->where('admin', 0)->get();
}
function getUrlByView($view)
{
    $page = new Page();
    $page->where('view', $view)->get();
    $language = $this->config->item('language');
    return $page->{'url_' . $language};
}

这是我的观点:

   <ul class="primary-nav">
    <?php foreach($menu as $page): ?>
     <li class="primary-nav__item">
        <a class="primary-nav__link" <?php if ($page_menu == $page->view): ?>class="active" <?php endif; ?>href="<?php echo base_url() . $this->config->item('language_abbr') . '/' . $page->{'url_' . $this->config->item('language')}; ?>"> 
            <?php echo mb_strtoupper($page->{'title_' . $this->config->item('language')}, 'UTF-8'); ?>
        </a>
    </li>
    <?php endforeach; ?>

我想做这样的事情:

function getSubMenu()
{
      if ($this->session->userdata('is_admin'))
        return $pages->where('position >', 0 && 'parent_id >', 0)->get();
    else
        // return $pages->where('position >', 0 && 'parent_id >', 0)->get();
        echo '<h1> yay </h1>';
}

(忽略yay,lol)但这显然还没有开始削减。

建议:您可以在同一个表中添加"parent_id"。如果有父级,则用父级id或0填充。

答案:将数据作为一个一维数组,其中所有行都带有父id。然后使用下面的函数创建一个带有父和子的多维数组。

function formatTree($tree, $parent = NULL) {
    $treeArray = array();
    foreach ($tree as $item) {
        if ($item['menu_parent'] == 0) {
            $treeArray[$item['menu_id']] = $item;
        }
        else {
            $treeArray[$item['menu_parent']]['sub'][] = $item;
        }
    }
    return $treeArray;
}

现在使用以下功能制作父子菜单的预期ul li列表

function buildMenu($menu_array, $is_sub = FALSE) {
    $attr = (!$is_sub) ? ' class="sidebar-menu"' : ' class="treeview-menu"';
    $menu = "<ul>"; // Open the menu container
    foreach ($menu_array as $id => $properties) {
        if (!isset($properties['sub'])) {
            $is_sub = TRUE;
        }
        elseif (empty($properties['sub'])) {
            $is_sub = TRUE;
        }
        foreach ($properties as $key => $val) {
            if (is_array($val) && !empty($val)) {
                $sub = $this -> buildMenu($val, TRUE);
            }
            else {
                $sub = NULL;
                $$key = $val;
            }
        }
        if ($properties['menu_url']) {
            $url = $properties['menu_url'];
        }
        $menu .= "<li>" . $menu_name . "</li>";
        unset($url, $menu_name, $sub);
    }
    return $menu . "</ul>";
}

我正在应用程序中使用此项。菜单数据的数组结构应为

array(
  [0] => array(
    'menu_name' => 'name',
    'menu_url' => 'url',
    'menu_id' => 'id',
    'menu_parent' => 'parent id'
  ),
 [1] => array(
    'menu_name' => 'name',
    'menu_url' => 'url',
    'menu_id' => 'id',
    'menu_parent' => 'parent id'
 )
)