Blade模板递归包含

6
我是一名有用的助手,可以为您翻译文本。
我有一个项目数组,代表服务器上目录的文件和目录结构。 $items数组的构造方式如下:
Array
(
    [folder1] => Array
        (
            [folder1_1] => Array
                (
                    [0] => filenameX.txt
                    [1] => filenameY.txt
                )
        )
    [pages] => Array
        (
        )
    [0] => filename.txt
    [1] => filename1.txt
)

我们想要的,基本上是每个节点都有<li><ul>
最终的HTML应该类似于:
  • folder1/
    • folder1_1/
      • filenameX.txt
      • filenameY.txt
  • pages/
  • filename_1.txt
  • filename_2.txt
现在,我的问题与Laravel的Blade模板引擎中的嵌套包含有关。
我有一个视图list.blade.php,其内容如下:
<div class="listing">
  @include('submenu', array('items', $items))
</div>

我将数组传递给它的方式如下:

View::make('list')->with('items', $items)

包含的模板(submenu.blade.php)如下所示:

<ul>
@foreach($items as $key=>$value)
    @if (is_array($value))
        <li>{{$key}}/
        @include('submenu', array('items', $value))
        </li>
    @else
        <li>{{$value}}</li>
    @endif
@endforeach
</ul>

如果$value是一个数组(目录),我会在模板内部使用相同的模板,但使用新数据进行包含。

首先,这是否可能?

如果不行,是否有其他方法可以实现所需的结果?

TIA,


请记住,递归可能非常长。 - papas-source
PHP致命错误:已用尽134217728字节的允许内存大小。 - papas-source
2个回答

8

是的,这是确实可能的。

然而,你的includes存在一个问题,你有:

@include('submenu', array('items', $value))

应该是:

@include('submenu', array('items' => $value))

值得一提的是还有一个隐藏的blade语句@each。您可以使用它来代替手动遍历数组,就像这样:
<ul>
    @each('item.detail', $items, 'item')
</ul>

然后,您需要创建一个名为item.detail的新刀版文件,并将之前在循环中拥有的内容放入该文件中。这有助于清理视图,避免越来越多的嵌套循环。

当您在新的刀版文件中时,项目的数据将保存在第三个参数中,即$item


0

不要使用数组,而是使用优美的集合。不要使用 @include,而是使用 \View::make。这样可以使代码更加简洁。以下是一个使用具有父/子关系的优美模型的 Foundation 5 框架下拉菜单示例:

我的模型具有父->子关系

public function children() {
    return $this->hasMany('Category', 'parent_id');
}

我在控制器中这样生成我的结果

$categories = \Category::where('parent_id', '=', '0')->with('children')->get();

Blade模板:_partials.dd-menu.blade.php

<ul class="{{$class}}">
@foreach($items as $item)
<?php
$active = $item->id == \Input::get('category') ? 'active' : '';
$hdd = $item->children->count() ? 'has-dropdown' : '';
?>
<li class="{{$hdd}} {{$active}}">
    <a href="?category={{$item->id}}">{{$item->name}}</a>
    @if ($item->children->count())
    {{ View::make('_partials.dd-menu')->withItems($item->children)->withClass('dropdown')}}
    @endif
</li>
@endforeach

在你的父Blade中:

<nav class="top-bar" data-topbar role="navigation">
            <ul class="title-area">
                <li class="name">
                    <h1><a href="?category=">Categories</a></h1>
                </li>
                <!-- Remove the class "menu-icon" to get rid of menu icon. Take out "Menu" to just have icon alone -->
                <li class="toggle-topbar menu-icon"><a href="#"><span>Menu</span></a></li>
            </ul>
            <section class="top-bar-section">
                <!-- Right Nav Section -->
                {{ View::make('_partials.dd-menu')->withItems($categories)->withClass('right')}}
            </section>
        </nav>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接