Я пытаюсь создать функцию для иерархической навигационной панели меню.
Я хочу иметь что-то вроде этого...
<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>
Это то, что он выводит сейчас, Andy:
<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>
Я думаю, что ваша проблема может иметь какое-то отношение к тому, что ваша функция рекурсивна, но строящаяся строка получает reset в верхней части вашей функции каждый раз, вместо того, чтобы снова вводить ее в функцию. Кроме того, я не вижу нигде, что суб будет возвращаться к нулю для вашей последней итерации. Кроме того, кажется, что вам не нужно запрашивать каждую отдельную строку. Было бы более эффективно запрашивать один раз и строить все меню. Я думаю, что рекурсия может быть отброшена. Кроме того, я бы рекомендовал хранить флаг "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;
}
UPDATE:
Попробуйте следующее:
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.
EDIT:
Я нашел его!
эта строка
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>";