我已经在 Laravel 4 中实现了一种在菜单中获得无限深度的方法。这并不是你所要求的,但该技术应该很容易适应。
对于初学者来说,我的菜单只是一个数组(目前),它被分配给主视图,看起来像这样。
$menu = array(
array(
'name' => 'item1',
'url' => '/'
),
array(
'name' => 'item2',
'url' => '/',
'items' => array(
array(
'name' => 'subitem1',
'url' => '/'
),
array(
'name' => 'subitem2',
'url' => '/'
)
)
)
);
您也可以使用模型轻松实现此结构。您将需要函数 child_items 或其他函数,因为我们将从上到下而不是自下而上呈现菜单。
现在在我的主刀片模板中,我这样做:
<ul>
@foreach ($menu as $item)
@include('layouts._menuItem', array('item' => $mainNavItem))
@endforeach
</ul>
然后在layouts._menuItem 模板中我这样做:
<?php
$items = array_key_exists('items', $item) ? $item['items'] : false;
$name = array_key_exists('name', $item) ? $item['name'] : '';
$url = array_key_exists('url', $item) ? url($item['url']) : '#';
$active = array_key_exists('url', $item) ? Request::is($item['url'].'/*') : false;
?>
<li class="@if ($active) active @endif">
<a href="{{ $url }}">{{ $name }}</a>
@if ($items)
<ul>
@foreach ($items as $item)
@include('layouts._menuItem', array('item' => $item))
@endforeach
</ul>
@endif
</li>
如您所见,此模板递归调用自身,但使用不同的$item 变量。这意味着可以在您的菜单结构中尽可能深入。 (php 块只是用来准备一些变量,所以我可以保持实际模板代码的清洁和可读性,从技术上讲它不是必需的)。
为了简单起见,我在上面的 sn-ps 中剥离了 Twitter Bootstrap 代码(我的模板/数组中实际上有标题、下拉切换、图标、分隔线……),所以代码没有经过测试。不过,完整版对我来说工作正常,所以如果我在某个地方犯了错误,请告诉我。
希望这对您(或其他任何人,因为这是一个相当古老的问题)有所帮助。如果您需要更多指针/帮助,或者想要我的完整代码,请告诉我。
编码愉快!