第三级子导航php

时间:2017-07-06 11:04:01

标签: php navigation

我有以下代码,可以完美地生成双层导航系统,问题是我有一个要求,其中一个部分的页面下面有第三级页面。

编辑:代码生成一个双层侧面导航项,列出本节中的页面以及顶部详细说明的父项,如下所示:

页面标题

  • Sub Page 1
  • 子页面2
    • 另一个子页面1
      • Further Sub Page 1
    • 另一个子Page 1
  • Sub Page 3

没有任何异常行为或错误消息,无法在列表中显示更多子页面1项。

function insection_make_ul($tree, $level=0) {
$indent = str_repeat("   ", $level);
$result = "\n".$indent."<ul>\n";
foreach($tree as $id => $item) {
    $result .= $indent."<li><a href=\"".$item['permalink']."\" class=\""
        .($item['selected'] == true ? 'selected' : '')
        .($level == 0 ? ' root' : '')."\" >" . $item['title']."</a>";
    if(count(@$item['items'])) {
        $result .= insection_make_ul($item['items'], ($level+1));
        $result .= $indent."</li>\n";
    }else{
        $result .= "</li>\n";
    }
}
$result .= $indent."</ul>\n";
return $result;

}

function insection($structure_id,$custom_selected=false){
$tree = insection_array($structure_id,$custom_selected);
return insection_make_ul($tree);

}

以及构建数组的代码

function insection_array($data,$custom_selected=false){
global $link;
if(is_numeric($data))
    $data = fetch_row('SELECT * FROM content_structure WHERE id = '.$data);
$selected_id = $data['id'];

if($custom_selected) // dynamic item of 'real' parent
    $selected_id .= '_'.$custom_selected;

$insection = array();
if($data['parent_id'] > 0){
    if(HIDE_EMPTY_STRUCTURE){
        $sql = 'SELECT * FROM content_structure WHERE parent_id = '.$data['id'].' AND visible = 1 AND in_menu = 1 
                                                      AND (item_id > 0 OR redirect <> "")';
    }else{
        $sql = 'SELECT * FROM content_structure WHERE parent_id = '.$data['id'].' AND visible = 1 AND in_menu = 1';
    }
    $result = mysqli_query($link, $sql);
    if(mysqli_num_rows($result) > 0 || $data['children_php'] != ''){
        $parent_id = $data['id'];
    }else{
        $parent_id = $data['parent_id'];
    }
}else{
    $parent_id = $data['id'];
}
while($parent_id > 0){
    $data = fetch_row('SELECT * FROM content_structure WHERE id = '.$parent_id);
    $insection[$parent_id] = array('id' => $data['id'],
        'title' => $data['menu_title'],
        'permalink' => navlink($data),
        'selected' => ($data['id'] == $selected_id ? true : false) );

    if(HIDE_EMPTY_STRUCTURE){
        $sql = 'SELECT * FROM content_structure WHERE parent_id = '.$parent_id.' AND visible = 1 AND in_menu = 1
                                                      AND (item_id > 0 OR redirect <> "") ORDER BY '
            .($data['sort_auto'] == 1 ? 'menu_title' : 'sort_order');
    }else{
        $sql = 'SELECT * FROM content_structure WHERE parent_id = '.$parent_id.' AND visible = 1 AND in_menu = 1 ORDER BY '
            .($data['sort_auto'] == 1 ? 'menu_title' : 'sort_order');
    }
    $result = mysqli_query($link, $sql);
    if(!$result){ die('error: '.mysqli_error($link)); }
    while($row = mysqli_fetch_assoc($result)){
        $insection[$parent_id]['items'][$row['id']] = array('id' => $row['id'],
            'title' => $row['menu_title'],
            'permalink' => navlink($row),
            'selected' => ($row['id'] == $selected_id ? true : false) );
    }

    // custom start
    if($data['children_php'] != ''){ // custom sub items?
        $sub_item_result = custom_navigation_array($data['children_php']);
        foreach($sub_item_result as $sub_item){
            $id = $data['id'].'_'.$sub_item['id']; // realparent_customid
            $insection[$parent_id]['items'][$id] = array('id' => $id,
                'title' => $sub_item['menu_title'],
                'permalink' => $sub_item['href'],
                'selected' => ($id == $selected_id ? true : false) );
        }
    }
    //custom end
    $parent_id = $data['parent_id'];
}

$insection = array_reverse($insection,true);
$temp = current($insection);
$root_id = @$temp['id'];
$insection_tree[$root_id] = current($insection);

$found_selected = false;
if(is_array(@$insection_tree[$root_id]['items'])){
    foreach($insection_tree[$root_id]['items'] as $id => $item){
        if(!empty($insection[$id])){
            if($insection_tree[$root_id]['items'][$id]['selected'] == true)
                $found_selected = true;
            $insection_tree[$root_id]['items'][$id] = $insection[$id];
        }
    }
}
//if(!$found_selected){
//  while(!$found_selected){
//
//  }
//}

return $insection_tree;

}

任何可能让我发挥作用的指针。

感谢

1 个答案:

答案 0 :(得分:0)

我个人建议重新查看你的代码。那里有很多代码在做同样的事情。重复很糟糕。作为一个帮助,这里有一些东西让你去。

以这个菜单结构为例,但是你真的要自己制作这个数组,主要注意的是将数组构建成<ul><li>字符串的函数。

        $menuItems = array(
        array(// Top level items
            "name" => "item1",
            "subs" => array(// Second Level items
                array(
                    "name" => "1a",
                    "href" => "something"
                ),
                array(
                    "name" => "1b",
                    "subs" => array(// Third Level Items
                        array("name" => "1ba", "href" => "something"),
                        array("name" => "1bb", array(
                                array("name" => "1cca", "href" => "something"),
                            )
                        )
                    )
                )
            )
        ),
        array(// Top level items
            "name" => "item2",
            "subs" => array(// Second Level items
                array(
                    "name" => "2a",
                    "href" => "something"
                ),
                array(
                    "name" => "2b",
                    "subs" => array(// Third Level Items
                        array("name" => "2ba", "href" => "something"),
                        array("name" => "2bb", array(
                                array("name" => "2cca", "href" => "something"),
                            )
                        )
                    )
                )
            )
        )
    );
        $this->menuIterator($menuItems);
        die();

以下逻辑是重要的一点,它意味着您的菜单可能是您想要的任何级别,它仍然会产生相同的结果:

public function menuIterator($items) {
    print "<ul>";
    foreach ($items as $item) {
        print "<li>";
        print "<a>{$item['name']}</a>";
        if (isset($item['subs'])) {
            $this->menuIterator($item['subs']);
        }
        print "</li>";
    }
    print "</ul>";
    return;
}

结果是:

<ul><li><a>item1</a><ul><li><a>1a</a></li><li><a>1b</a><ul><li><a>1ba</a></li><li><a>1bb</a></li></ul></li></ul></li><li><a>item2</a><ul><li><a>2a</a></li><li><a>2b</a><ul><li><a>2ba</a></li><li><a>2bb</a></li></ul></li></ul></li></ul>