Я пытаюсь создать функцию для иерархической навигационной панели меню.
Я хочу иметь что-то вроде этого …
<ul id="navigation"> <li><a href="#">Menu Item 1</a></li> <li><a href="#">Menu Item 2</a></li> <ul> <li><a href="#">Sub Menu Item 1</a></li> <li><a href="#">Sub Menu Item 1</a></li> </ul> <li><a href="#">Menu Item 3</a></li> <li><a href="#">Menu Item 4</a></li> </ul>
Я использую эту функцию, но она работает неправильно, как хотелось бы. Он показывает основные родительские ссылки, но не дочерние ссылки.
function build_navbar($pid,$sub=0) { global $db; $query = $db->simple_select("navbar", "*", "pid='".$pid."'", array("order_by" => "disporder")); $menu_build = "<ul id=\"navigation\">\n"; while($menu = $db->fetch_array($query)) { if($sub == 1) { $menu_build .= "<ul>\n"; $menu_build .= "<li><a href=\"#\">".$menu['title']."</a></li>\n"; $menu_build .= "</ul>\n"; } else { $menu_build .= "<li><a href=\"#\">".$menu['title']."</a></li>\n"; } build_navbar($menu['id'],1); } $menu_build .= "</ul>\n"; return $menu_build; }
Может быть, кто-то может помочь мне исправить это? Благодарю.
— Новое обновление —
Энди Грофф, это то, что выводит ваш код:
<ul id="navigation"> <li><a href="#">Home</a></li> <ul> <li><a href="#">Child Link</a></li> <li><a href="#">Child 2</a></li> </ul> <li><a href="#">Parent</a></li> </ul>
Однако мне нужно, чтобы он был изменен, поэтому он будет выводиться следующим образом:
<ul id="navigation"> <li><a href="#">Home</a> <ul> <li><a href="#">Child Link</a></li> <li><a href="#">Child 2</a></li> </ul> </li> <li><a href="#">Parent</a></li> </ul>
Это то, что он выводит сейчас, Энди:
<ul id="navigation"> </li> <li><a href="#">Home</a> </li> <ul> <li> <a href="#">Child Link</a> </li> <li><a href="#">Child 2</a> </ul> </li> <li><a href="#">Parent</a> </ul>
Я думаю, что ваша проблема может иметь какое-то отношение к тому факту, что ваша функция рекурсивна, но строка, которую вы строите, каждый раз перезагружается в верхней части вашей функции, а не снова вводится в функцию. Кроме того, я не вижу нигде, что суб будет возвращаться к нулю для вашей последней итерации. Кроме того, кажется, что вам не нужно запрашивать каждую отдельную строку. Было бы более эффективно запрашивать один раз и строить все меню. Я думаю, что рекурсия может быть отброшена. Кроме того, я бы рекомендовал хранить флаг «sub» в ваших данных, вместо того, чтобы использовать некоторую трудную для понимания php-логику относительно того, является ли данная строка подменю. Я сделал изменения, основанные на этих понятиях, не знаю, работает ли это или нет, но поскольку у меня нет / нет необходимости создавать данные для его проверки:
function build_navbar() { global $db; //first things first, i'd recommend putting a "sub" flag in your database. This example will use it. //start off by getting all of the rows. No need for recursion. $query = $db->simple_select("navbar", "*", "1", array("order_by" => "disporder")); $menu_build = "<ul id=\"navigation\">\n"; //keep track of what level we're at $level = 1; while($menu = $db->fetch_array($query)) { //get sub from data $sub = $menu['sub'] //we need to go back to root level if($sub == 0 && $level == 2){ $level--; $menu_build .= "</ul></li>\n"; } else $menu_build .= "</li>\n"; //we need to go up one level if($sub == 1 && $level == 1) { $level++; $menu_build .= "<ul><li>\n"; } else $menu_build .= "<li>"; //always print out a link $menu_build .= "<a href=\"#\">".$menu['title']."</a>\n"; } $menu_build .= "</ul>\n"; return $menu_build; }
ОБНОВИТЬ:
Попробуй это:
function build_navbar($pid, $sub=0) { global $db; $class = $sub ? "sub" : "navigation"; $menu_build = "<ul class=\"$class\">\n"; $query = $db->simple_select("navbar", "*", "pid='".$pid."'"); while($menu = $db->fetch_array($query)) { $menu_build .= "<li><a href=\"#\">".$menu['title']."</a>\n"; // build child links $menu_build .= build_navbar($menu['id'],1); } $menu_build .= "</ul>"; return $menu_build; }
То, что мы делаем здесь, позволяет каждой функции создавать группу <ul><li>
, переменная $sub
будет определять, что будет идентификатором <ul>
, что позволит вам по-разному определять каждую ul.
РЕДАКТИРОВАТЬ:
Я нашел это!
эта линия
build_navbar($menu['id'],1);
необходимо изменить на это:
$menu_build = build_navbar($menu['id'],1);
Похоже, он должен работать на меня.
То, что я сделал бы, это добавить некоторые echo
отображающие SQL-запрос, который выполняется каждый раз, затем вы можете скопировать его в phpmyadmin (или какой-либо браузер db, который вы используете). Посмотрите, возвращает ли он нулевой результат. Если это так, может быть что-то не так с вашими данными.
так например:
echo "SELECT FROM navbar * WHERE pid='$pid' ORDER_BY disporder;<br>";