Laravel 5.5 рекурсивная функция для создания меню - PullRequest
0 голосов
/ 17 мая 2018

Я создал таблицу MySQL, как показано ниже:

id | menuname          | parentid
---+-------------------+---------
 1 | dashboard         |        0
 2 | Content           |        0
 3 | Home Page Content |        2
 4 | Banners           |        2
 5 | Settings          |        0
 6 | Block Content     |        3
 7 | Site Content      |        3

Так что структура меню будет выглядеть так:

  • панель
  • Содержание
    • Содержание домашней страницы
      • Содержимое блока
      • Содержание сайта
  • Баннеры
  • Настройки

У меня есть контроллер:

public function index() {
    $data = array();

    $permissionRecord = Permission::all();
    $this->categoryTree($permissionRecord);

    dd('-end-);
    $data['permissionRecord'] = $permissionRecord;

    return view('Administrator.permission.permissionAdd',$data);
}

function categoryTree($permissionRecord, $parent_id = 0, $sub_mark = '')
{
    foreach($permissionRecord as $row) {
        echo $sub_mark.$row->name;

        $this->categoryTree($permissionRecord, $row->id, $sub_mark.'---');
    }
}

Но это показывают данные:

Панель управления --- Панель ------ Панель --------- Панель ------------ ------------ Dashboard --- Панель ------------------ Панель --------------------- Dashboard ----- ------------------- Dashboard --------------------------- Dashboard-- ----------------------------Приборная доска--------------------- ------------ Панель ------------------------------------ Dashboard

Обратите внимание, что я dd () внутри контроллера и не передал данные в представление.

1 Ответ

0 голосов
/ 17 мая 2018

Вы не учли родительский идентификатор:

function categoryTree($permissionRecord, $parent_id = 0, $sub_mark = '')
{
    foreach($permissionRecord as $row) {
        if ($row->parentid == $parent_id) {
            echo $sub_mark.$row->name;

            $this->categoryTree($permissionRecord, $row->id, $sub_mark.'---');
        }
    }
}

Попробуйте и посмотрите, что произойдет. - Примечание. Я завернул рекурсивный вызов функции в if(), который проверяет, являются ли текущие записи parentIdравно родительскому идентификатору, переданному в метод.

Чтобы отобразить элементы в списке с отступом:

public function categoryTree($permissionRecord, $parent_id = 0)
{
    $html = '<ul>';

    foreach($permissionRecord as $row) {
        if ($row->parentid == $parent_id) {
            $html .= '<li>' . $row->menuname;

            $html .= $this->categoryTree($permissionRecord, $row->id, $html);

            $html .= '</li>';
        }
    }

    $html .= '</ul>';

    return $html;
}

Затем просто вызовите:

$html = $this->categoryTree($permissionRecord);

Пример работы с модульным тестом

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...