Squeak.ru - шаблоны программирования

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

Я разрабатываю систему управления контентом, и у меня возникла проблема с дочерними и родительскими отношениями меню в CMS.

В основном у меня есть система, которая может создавать меню и подменю. А вот так выглядят массивы в базе данных.

 array:6 [
       0 => array:4 [
        "id" => 4
        "name" => "Contacts"
        "order" => 0
        "parent_menu_id" => null
      ]
      1 => array:4 [
        "id" => 1
        "name" => "Leads"
        "order" => 1
        "parent_menu_id" => null
      ]
      2 => array:4 [
        "id" => 2
        "name" => "List Leads"
        "slug" => "list-leads"
        "order" => 1
        "parent_menu_id" => 1
      ]
      3 => array:4 [
        "id" => 5
        "name" => "Edit Leads"
        "slug" => "edit-leads"
        "order" => 1
        "parent_menu_id" => 1
      ]
      4 => array:4 [
        "id" => 3
        "name" => "Create New"
        "slug" => "new"
        "order" => 2
        "parent_menu_id" => 2
      ]
      5 => array:4 [
        "id" => 14
        "name" => "Tasks"
        "slug" => "tasks"
        "order" => 3
        "parent_menu_id" => null
      ]
    ]

Я вставляю меню и подменю, используя родительский идентификатор в таблице меню. Я получаю меню из БД, как указано выше. Итак, как я буду генерировать/рендерить меню в иерархической форме, такой как древовидная структура?

Мне нужно перебрать массив, который может иметь любое количество переходов, и разумно отсортировать его по родительским дочерним отношениям. Я смог это сделать, но только на один уровень в глубину. Он должен управлять детьми с детьми с детьми и т. д. с бесконечным количеством слоев и выводить их в раскрывающееся меню HTML и вложенные списки раскрывающихся элементов.

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

    public static function render_module_menu() {
          $menus = MenusModel::leftJoin('modules', 'menus.module_id', '=', 'modules.id')->where('modules.enable', 1)->select('menus.*')->orderBy('order')->get()->toArray();

          foreach ($menus as $menu) {
            $childMenus = MenusModel::where('parent_menu_id', $menu['id'])->orderBy('order')->get()->toArray();

            if ($childMenus) {
              echo '<li class="nav-item dropdown">
                      <a class="nav-link dropdown-toggle" href="#" id="pagesDropdown" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
                        <i class="'.$menu['icon'].'"></i>
                        <span>'.$menu['name'].'</span>
                      </a>
                      <div class="dropdown-menu" aria-labelledby="pagesDropdown">';
              foreach ($childMenus as $child) {
                 echo '<a class="dropdown-item" href="'.url($menu['slug'].'/'.$child['slug']).'">
                          <i class="'.$child['icon'].'" style="margin-right: 10px;"></i>
                       '.$child['name'].'</a>';

              }
              echo '</div>
                    </li>';
            } else {
                echo '<li class="nav-item">
                        <a class="nav-link" href="'.url($menu['slug']).'">
                          <i class="'.$menu['icon'].'"></i>
                          <span>'.$menu['name'].'</span></a>
                      </li>';
            }

          }
        }
05.12.2018

Ответы:


1

1-я функция:

public static function GenerateMenuArray($arr, $parent = 0)
{
$pages = Array();
foreach($arr as $page)
{
if($page['parent_menu_id'] == $parent)
{
$page['sub'] = isset($page['sub']) ? $page['sub'] : self::GenerateMenuArray($arr, $page['id']);
$pages[] = $page;
}
}
return $pages;
}

2-я функция:

// loop the multidimensional array recursively to generate the HTML
public static function GenerateMenuHTML($nav, $level=0)
{
$menus = MenusModel::leftJoin('modules', 'menus.module_id', '=', 'modules.id')->select('menus.*')->where('modules.enable', 1)->where('parent_menu_id', null)->orderBy('order')->get()->toArray();

$html = '';
foreach($nav as $page)
{
// dd($page);
if (empty($page['sub'])) {
if ($page['parent_menu_id'] == null) {
$html .= '<li class="nav-item">
<a class="nav-link" href="'.url($page['slug']).'">
<i class="'.$page['icon'].'"></i>
<span>'.$page['name'].'</span></a>
</li>';
} else {
foreach ($menus as $parent) {
$parent_slug = $parent['slug'];
if($parent['id'] == $page['parent_menu_id'] AND $page['external'] == 0) {
$html .= '<a class="dropdown-item" href="'.url($parent_slug.'/'.$page['slug']).'">
<i class="'.$page['icon'].'" style="margin-right: 10px;"></i>
'.$page['name'].'</a>';
}
}

if ($page['external'] == 1) {
$html .= '<a class="dropdown-item" href="'.url($page['slug']).'">
<i class="'.$page['icon'].'" style="margin-right: 10px;"></i>
'.$page['name'].'</a>';
}

}

} else {
if ($level > 0) {
$html .= '</div></li>';
}
$html .= '<li class="nav-item dropdown">
<a class="nav-link dropdown-toggle" href="#" id="pagesDropdown" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
<i class="'.$page['icon'].'"></i>
<span>'.$page['name'].'</span></a>
<div class="dropdown-menu" aria-labelledby="pagesDropdown">';


$level = ++$level;
$html .= self::GenerateMenuHTML($page['sub'], $level);
$level = --$level;

if ($level > 0) {
$html .= '</div></li>';
}
}
}
return $html;
}

// loop the multidimensional array recursively to generate the HTML
public static function GenerateNavHTML($nav)
{
$html = '';
foreach($nav as $page)
{
$html .= '<ul><li>';
$html .= '<a href="' . $page['slug'] . '">' . $page['name'] . '</a>';
$html .= self::GenerateNavHTML($page['sub']);
$html .= '</li></ul>';
}
return $html;
}

Пожалуйста, попробуйте это.

04.01.2019
  • Спасибо за ваши усилия. :-) 04.01.2019

  • 2

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

    function printChildren($children){
        foreach($children as $child){
            //(add code to print menu item)
            $moreChildren = //(add code to find children of this menu item)
            printChildren($moreChildren);
        }
    }
    
    05.12.2018
    Новые материалы

    Угловая структура архитектуры
    Обратите внимание, что эта статья устарела, я решил создать новую с лучшей структурой и с учетом автономных компонентов: https://medium.com/@marekpanti/angular-standalone-architecture-b645edd0d54a..

    «Данные, которые большинство людей используют для обучения своих моделей искусственного интеллекта, поставляются со встроенным…
    Первоначально опубликовано HalkTalks: https://hacktown.com.br/blog/blog/os-dados-que-a-maioria-das-pessoas-usa-para-treinar-seus-modelos-de-inteligencia-artificial- ja-vem-com-um-vies-embutido/..

    Сильный ИИ против слабого ИИ: различия парадигм искусственного интеллекта
    В последние годы изучению и развитию искусственного интеллекта (ИИ) уделяется большое внимание и прогресс. Сильный ИИ и Слабый ИИ — две основные парадигмы в области искусственного интеллекта...

    Правильный способ добавить Firebase в ваш проект React с помощью React Hooks
    React + Firebase - это мощная комбинация для быстрого и безопасного создания приложений, от проверки концепции до массового производства. Раньше (знаете, несколько месяцев назад) добавление..

    Создайте API с помощью Python FastAPI
    Создание API с помощью Python становится очень простым при использовании пакета FastAPI. После установки и импорта вы можете создать приложение FastAPI и указать несколько конечных точек. Каждой..

    Веселье с прокси-сервером JavaScript
    Прокси-серверы JavaScript — это чистый сахар, если вы хотите создать некоторую общую логику в своих приложениях, чтобы облегчить себе жизнь. Вот один пример: Связь клиент-сервер Мы..

    Получить бесплатный хостинг для разработчиков | Разместите свой сайт за несколько шагов 🔥
    Статические веб-сайты — это веб-страницы с фиксированным содержанием и его постоянным содержанием. Но теперь статические сайты также обрабатывают динамические данные с помощью API и запросов...