我有以下代码,可以完美地生成双层导航系统,问题是我有一个要求,其中一个部分的页面下面有第三级页面。
编辑:代码生成一个双层侧面导航项,列出本节中的页面以及顶部详细说明的父项,如下所示:
页面标题
没有任何异常行为或错误消息,无法在列表中显示更多子页面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;
}
任何可能让我发挥作用的指针。
感谢
答案 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>