Третий уровень суб-навигации php

У меня есть следующий код, который идеально подходит для создания двухуровневой системы навигации, проблема в том, что у меня есть требование, когда один раздел имеет третий уровень страниц под ним.

Редактировать: код создает двухуровневый элемент боковой навигации, который перечисляет страницы в этом разделе вместе с родительским элементом, детализированным вверху, например:

Заголовок страницы

  • Под страница 1
  • Под страница 2
    • Другая Под страница Page 1
      • Далее Sub Page 1
    • Другая Под страница Page 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 ответ

Лично я бы посоветовал пересмотреть ваш код. Там много кода, делающего то же самое. Повторение это плохо. В качестве помощи, вот что поможет вам.

Возьмите эту структуру меню в качестве примера, но на самом деле вы сами должны создать этот массив, главное, на что нужно обратить внимание, это функция, которая создаст массив в <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>

Другие вопросы по тегам