2017-07-06 76 views
1

我有下面的代码,它完美地适用于生成双层导航系统,问题是我有一个要求,其中一个部分有第三级的网页下面。第三级的子导航php

编辑:代码产生列出本节中的页面在顶部像这样详述的父项沿着两层侧导航项目:

页标题

  • 子1
  • 子页2
    • 另一子1
      • 进一步的子页1
    • 另一子1
  • 子页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

'不管我怎么努力也没有工作。“好吧,由于它有很多代码,所以没有人希望通过你的整个代码。你可以根据http://stackoverflow.com/help/how-to-ask来编辑你的问题,并告诉我们什么不起作用?告诉我们你的期望,以及实际发生的情况。错误讯息?奇怪的行为?没有这些信息,我不认为有人会帮助你。 – Twinfriends

+0

嗨,感谢您的回复,我已经修改了一些关于什么可行,什么部分不起作用的更多信息。 – James

回答

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>

+0

感谢您的建议,我一定会在时间允许的时候仔细研究一下代码,这是不是我的遗留代码,所以也会查看您的建议。 – James