Навигационное меню PHP / MySQL

0

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

Я хочу иметь что-то вроде этого...

<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>
  • 0
    Не могли бы вы показать нам, что это выводит?
  • 0
    Конечно. Я обновил свой пост с вопросом.
Показать ещё 3 комментария
Теги:

2 ответа

1
Лучший ответ

Я думаю, что ваша проблема может иметь какое-то отношение к тому, что ваша функция рекурсивна, но строящаяся строка получает 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;
}
  • 0
    Спасибо за ваш код! Кажется, что он работает отлично, но мне нужна одна модификация, которую я не могу заставить работать. Пожалуйста, смотрите мой первый пост для информации. Благодарю.
  • 0
    попробуйте редактирование, которое я сделал
Показать ещё 1 комментарий
0

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>";
  • 0
    $ sub присваивается при вызове функции, не так ли? 0 изначально, затем 1, когда это подменю.
  • 0
    Да исправить. $ sub назначается при вызове функции.
Показать ещё 7 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню