Laravel 4 - 不止一次扩展在主模板中声明的部分

时间:2013-08-24 09:40:12

标签: php templates laravel-4 blade template-inheritance

我有一个场景,我有一个定义标题部分的主模板。它看起来像这样......

<!DOCTYPE html>

<html>
<head>
@section('header')
    {{ HTML::style('css/planesaleing.css') }}
    {{ HTML::script('js/jquery-1.10.1.js') }}
    {{ HTML::script('js/search_Bar.js') }}
@show
</head>
<body>
    <div class="planesaleing_page">
        <header>
@yield('header_bar')
@yield('nav_bar')
@yield('search_bar')
        </header>
        <div class="main_page">
                // Some more code
        </div>
@yield('footer')
    </div>
</body>
</html>

如您所见,我有几个子视图(例如nav_bar和search_bar)。每个子视图都有一个附带的.js文件。所以我想扩展标题&#39; nav_bar中的部分就像这样...

@section('header')
@parent
    {{ HTML::script('js/anotherjs.js') }}
@stop

然后再次在search_bar中这样:

@section('header')
@parent
    {{ HTML::script('js/yetanotherjs.js') }}
@stop

目的是最终输出的html文件如下所示:

    @section(&#39;头&#39;)         {{HTML :: style(&#39; css / planesaleing.css&#39;)}}         {{HTML :: script(&#39; js / jquery-1.10.1.js&#39;)}}         {{HTML :: script(&#39; js / search_Bar.js&#39;)}}         {{HTML :: script(&#39; js / anotherjs.js&#39;)}}         {{HTML :: script(&#39; js / yetanotherjs.js&#39;)}}     @节目     

但是,只有第一个实际扩展了标题,之后的所有其他标题似乎都被忽略了。无论如何都要使用多个扩展名吗?

任何建议 - 非常感谢。

1 个答案:

答案 0 :(得分:9)

首先,在视图中扩展布局时,先启动一个部分,然后“停止”。像这样:

@section('header')
@parent
    {{ HTML::script('js/anotherjs.js') }}
@stop

你如何扩展布局?我不确定您是否有多个相互扩展的布局,然后通过视图进行扩展,或者您有多个视图,每个视图都扩展了这个特定的布局。现在在以后的情况下,一个视图不会对另一个视图产生任何影响。

如果您使用的是前一种方法,那么更多示例代码会有所帮助,因为我认为您在某个时间点编写了这些值。

希望它有所帮助。

修改

当你说:

<header>
   @yield('header_bar')
   @yield('nav_bar')
   @yield('search_bar')
</header>

您正在制作具有三个不同名称的占位符。因此nav_bar,search_bar不是子视图,但它们是可以从您的视图填充的占位符。

让我以另一种方式说。当您的视图扩展模板时,它们将填充模板中声明的间隙。因此,每个'标题','search_bar'等都需要填充 ONCE 。因此,如果您有一个名为index.blade.php的视图,则可以填写一次。所以你可以像这样使用index.blade.php:

@section('header')
@parent
    {{ HTML::script('js/anotherjs.js') }}
@stop

@section('header_bar')
@parent
    {{ HTML::script('js/yetanotherjs.js') }}
@stop

@section('nav_bar')
@parent
    {{ HTML::script('js/foojs.js') }}
@stop
@section('search_bar')
@parent
    {{ HTML::script('js/foojs.js') }}
@stop

现在,如果我们看一下,它将会产生什么:

<!DOCTYPE html>

<html>
<head>
@section('header')
    {{ HTML::style('css/planesaleing.css') }}
    {{ HTML::script('js/jquery-1.10.1.js') }}
    {{ HTML::script('js/search_Bar.js') }}//from parent till this point
    {{ HTML::script('js/anotherjs.js') }} //comes from view
@show
</head>
<body>
    <div class="planesaleing_page">
        <header>
{{ HTML::script('js/yetanotherjs.js') }} //comes in place of header_bar as nothing in parent

//@yield('header_bar')

{{ HTML::script('js/foojs.js') }}//comes in place of nav_bar as nothing in parent

//@yield('nav_bar')

{{ HTML::script('js/foojs.js') }}//comes in place for search_bar as nothing in parent

//@yield('search_bar')
        </header>
        <div class="main_page">
                // Some more code
        </div>
@yield('footer')
    </div>
</body>
</html>

这就是为什么只有第一个似乎在扩展主人。我想你应该重新考虑一下你试图扩展主人的方式。

什么对你有用

@include('view.name') // includes a subview

但是我不确定这些部分是否会从每个子视图级联。你可以尝试一下。

所以你将有一个名为index.blade.php的视图,它看起来像是:

@extends('master')

@include('search_bar')
@include('nav_bar')
@include('foo_bar')

然后您将拥有单独的文件,例如search_bar.blade.php和其他文件,这些文件将扩展master并填充占位符,如下所示:

@extends('master')
 @section('header')
 @parent
    {{ HTML::script('js/anotherjs.js') }}
 @stop

我相信(没有测试过)这应该做你的工作。然后,它可以级联所有子视图的输入并将其组合在一起。所以所有子视图都将填充标题部分,这应该在最终输出中级联在一起。尝试一下,如果它有效,那就太棒了!否则尝试不同的方法来注入脚本。