【问题标题】:Laravel 4 - Extending a section declared in a master template more than onceLaravel 4 - 多次扩展主模板中声明的部分
【发布时间】:2013-08-27 08:22:51
【问题描述】:

我有一个场景,我有一个定义标题部分的主模板。好像是这样的……

<!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 文件。所以我想像这样扩展 nav_bar 中的“标题”部分...

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

然后在 search_bar 中再次像这样:

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

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

@section('标题') {{ HTML::style('css/planesaleing.css') }} {{ HTML::script('js/jquery-1.10.1.js') }} {{ HTML::script('js/search_Bar.js') }} {{ HTML::script('js/anotherjs.js') }} {{ HTML::script('js/yetanotherjs.js') }} @显示

但是,只有第一个实际上扩展了标题,之后的所有其他似乎都被忽略了。有没有办法使用多个扩展?

任何建议 - 非常感谢。

【问题讨论】:

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


    【解决方案1】:

    首先,当您在视图中扩展布局时,您会开始一个部分,然后“停止”。像这样:

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

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

    如果您使用前一种方法,更多示例代码会有所帮助,因为我认为您在某个时间点过度写入值。

    希望对你有帮助。

    编辑

    当你说:

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

    您正在制作具有三个不同名称的占位符。所以 nav_bar, search_bar 不是子视图,而是可以从您的视图中填充的占位符。

    让我换一种说法。当您的视图扩展模板时,它们将填补模板中声明的空白。所以每个'header'、'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
    

    我相信(尚未测试)这应该可以完成您的工作。然后它可以级联来自所有子视图的输入,并按照您的需要将它们组合在一起。所以所有的子视图都将填充标题部分,这应该在最终输出中级联在一起。试试看,如果它有效,那就太好了!否则尝试不同的方法来注入脚本。

    【讨论】:

    • 我已经编辑了这个问题,以进一步说明我想要实现的目标......基本上,我正在尝试做你提到的第二件事......
    猜你喜欢
    • 1970-01-01
    • 2014-09-19
    • 2013-11-03
    • 2013-06-08
    • 2012-12-30
    • 2014-11-19
    • 1970-01-01
    • 1970-01-01
    • 2016-06-09
    相关资源
    最近更新 更多