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]);