刀片模板递归包括

时间:2014-03-12 18:55:42

标签: php templates laravel laravel-4 blade

我有一个项目数组,代表服务器上目录的文件和目录结构。

$items数组的构造如下:

Array
(
    [folder1] => Array
        (
            [folder1_1] => Array
                (
                    [0] => filenameX.txt
                    [1] => filenameY.txt
                )
        )
    [pages] => Array
        (
        )
    [0] => filename.txt
    [1] => filename1.txt
)

我们想要的是,<ul>每个节点都有<li>

生成的HTML应该类似于

  • 文件夹1 /
    • folder1_1 /
      • filenameX.txt
      • filenameY.txt
  • 页/
  • filename_1.txt
  • filename_2.txt

现在,我的问题与使用laravel的刀片模板引擎的嵌套包含有关。

我有一个包含以下内容的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是一个数组(目录),我@inlude自己内部的相同模板但使用新数据

首先,这有可能吗?

如果没有,是否有其他方法可以达到预期效果?

TIA,

2 个答案:

答案 0 :(得分:6)

是的,这确实是可能的。

但是,您的套餐中存在问题,您有:

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

应该是:

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

值得注意的是另一个隐藏的刀片状态@each。您可以使用它而不是自己循环遍历数组,如下所示:

<ul>
    @each('item.detail', $items, 'item')
</ul>

然后,您创建一个名为item.detail的新刀片文件,并在该文件中弹出您之前在循环中的内容。它有助于清理您的视图,使其具有越来越多的嵌套循环。

当您进入新刀片文件时,该项目的数据将保留在第三个参数中,在本例中为$item

答案 1 :(得分:0)

使用雄辩的集合,而不是使用数组。而不是使用@include,使用\ View :: make。它稍微清理了代码。以下是Foundation 5框架的示例下拉菜单,使用具有父/子关系的雄辩模型:

我的模型有父 - >子关系

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

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

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

刀片模板:_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

在您的父级刀片中:

<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>