多级子菜单codeigniter

时间:2016-05-11 09:12:03

标签: php html codeigniter multidimensional-array

我必须将现有菜单扩展为多级菜单。我很难缠绕它,所以我希望有人可以帮助我。

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

  2. 然后我想查看此列是否已填写,大于> 0.

  3. 当然,检查一下id == parent_id。

  4. 如果是这样,我希望在父项的悬停时显示我的子菜单。

    我当前的菜单是一个多语言菜单。

    这是我目前的模特:

    data.table

    这是我的观点:

    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; ?>
    

    (忽略yay,哈哈)但这显然不会开始削减它。

1 个答案:

答案 0 :(得分:0)

建议:您可以在同一个表格中添加“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'
 )
)