Laravel - Создание выпадающего меню для каждого родителя во вложенном наборе

Я использую etrepat / baum для создания категорий для моего приложения в проекте laravel. У меня проблема при использовании @foreach в лезвии, когда я хочу создать выпадающее меню начальной загрузки для категорий. Это прекрасно работает, когда структура выглядит так:

<nav id="nav2" role="navigation">
  <ul class="nav navbar-nav">
    <li class="dropdown">
      <a href="#" class="dropdown-toggle" data-toggle="dropdown">Shop by Category<span class="caret"></span></a>
      <ul class="dropdown-menu" role="menu">
        @foreach($catnav as $cat) @if($cat->depth == 0)
        <li>
          {{ HTML::link(URL::action('StoreController@getCategories', [$cat->slug]), $cat->name) }} @else($cat->depth == 1)
          <ul>
            <li><a href="{{ URL::to('/store/categories/' . implode('/', $cat->getAncestorsAndSelf()->lists('slug'))) }}">{{$cat->name}}</a>
            </li>
          </ul>
        </li>
        @endif @endforeach
      </ul>
    </li>
  </ul>
</nav>

Это вывод к вышесказанному:

Но я не хочу иметь выпадающий список по категориям, но я пытаюсь сделать dropdown для каждой из родительских категорий, чтобы содержать детей в dropdown-menu, Я попробовал эту структуру, но @foreach будет возиться с макетом.

<nav id="nav2" role="navigation">
  <ul class="nav navbar-nav">
    @foreach($catnav as $cat) @if($cat->depth == 0)
    <li class="dropdown">
      <a href="#" class="dropdown-toggle" data-toggle="dropdown">{{ HTML::link(URL::action('StoreController@getCategories', [$cat->slug]), $cat->name, array('class'=>'dropdown-toggle' ,'data-toggle'=>'dropdown')) }}<span class="caret"></span></a>
      @else($cat->depth == 1)
      <ul class="dropdown-menu" role="menu">
        <li><a href="{{ URL::to('/store/categories/' . implode('/', $cat->getAncestorsAndSelf()->lists('slug'))) }}">{{$cat->name}}</a>
        </li>
        @endif
      </ul>
    </li>
    @endforeach
  </ul>
</nav>

Как мне этого добиться?

2 ответа

Решение

После долгого дня, пытаясь понять это, я закончил:

  • С использованием toHierarchy() метод для возврата вложенной коллекции запрашиваемого дерева.

  • Используя @foreach цикл, чтобы получить все родительские узлы и внутри другого @foreach чтобы получить детей.

  • С использованием isRoot() функция, чтобы проверить, является ли элемент родительским.

  • С помощью isLeaf() функция, чтобы проверить, является ли конец ветви.

  • Используя много @if заявления.

Решение:

<nav id="nav2" role="navigation">
    <ul class="nav navbar-nav">
    @foreach($catnav as $item)
        <li @if($item->isRoot())class ="dropdown"@endif>
            @if(!$item->isLeaf())
                <a @if($item->isRoot()) class="dropdown-toggle"@endif href="/store/categories/{{ $item->slug }}">
                {{ $item->name }}
                @if($item->isRoot()) <span class="caret"></span> @endif
                </a>
            @else
                <a href="/store/categories/{{ $item->slug }}">{{$item->name}}</a>
            @endif
            @if($item->isRoot() && !$item->isLeaf())
            <ul class="dropdown-menu">
                @foreach($item->children as $child)
                  <li><a href="{{ URL::to('/store/categories/'.implode('/', $child->getAncestorsAndSelf()->lists('slug'))) }}">{{$child->name}}</a></li>
                @endforeach
            </ul>
            @endif
        </li>
    @endforeach
    </ul>
</nav>

Вот пакет, который я создал, чтобы легко создать выпадающее меню и просто сосредоточиться на разработке.

Вы можете создать выпадающее меню, просто используя этот код:

  • Лезвие:

    {!! Dropmenu::display('MenuName') !!}
    
  • контроллер:

    $menu = Dropmenu::display('MenuName');
    return view('name.view', ['menu' => $menu]);
    
Другие вопросы по тегам