WedX - журнал о программировании и компьютерных науках

Меню навигации PHP/MySQL

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

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

<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>
11.04.2011

  • Не могли бы вы показать нам, что он выводит? 12.04.2011
  • Конечно. Я обновил свой пост с вопросом. 12.04.2011
  • Не могли бы вы дать схему для вашей базы данных? 12.04.2011
  • Хорошо, я добавил схему базы данных в пост. 12.04.2011
  • вы должны использовать jQuery UI с ajax 12.04.2011

Ответы:


1

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

  • 2

    ОБНОВИТЬ:

    Попробуй это:

    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 (или любой другой браузер базы данных, который вы используете). Посмотрите, возвращает ли он также нулевой результат. Если это так, возможно, что-то не так с вашими данными.

    так например:

    echo "SELECT FROM navbar * WHERE pid='$pid' ORDER_BY disporder;<br>";
    
    11.04.2011
  • $sub назначается при вызове функции, не так ли? 0 изначально, затем 1, когда это подменю. 12.04.2011
  • о, хороший вызов, как я пропустил это в вызове функции? хорошие времена 12.04.2011
  • получает ли подзапрос строки, если вы запускаете его в phpmyadmin? 12.04.2011
  • @ohmusama: Спасибо, это сработало, однако мне нужно решить еще одну проблему. Пожалуйста, смотрите мое обновление в моем посте. Спасибо! 12.04.2011
  • Я как-то предполагал, что так и будет. Попробуйте добавить дополнительные данные и использовать мою функцию. Это даст вам гораздо больше гибкости в организации вещей в будущем. 12.04.2011
  • Попробуйте что-то вроде этого, это должно привести к тому, что вы хотите. 12.04.2011
  • Новые материалы

    Как создать диаграмму градиентной кисти с помощью D3.js
    Резюме: Из этого туториала Вы узнаете, как добавить градиентную кисть к диаграмме с областями в D3.js. Мы добавим градиент к значениям SVG и применим градиент в качестве заливки к диаграмме с..

    Я хотел выучить язык программирования MVC4, но не мог выучить его раньше, потому что это выглядит сложно…
    Просто начните и учитесь самостоятельно Я хотел выучить язык программирования MVC4, но не мог выучить его раньше, потому что он кажется мне сложным, и я бросил его. Это в основном инструмент..

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

    Объяснение документов 02: BERT
    BERT представил двухступенчатую структуру обучения: предварительное обучение и тонкая настройка. Во время предварительного обучения модель обучается на неразмеченных данных с помощью..

    Как проанализировать работу вашего классификатора?
    Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..


    Для любых предложений по сайту: [email protected]