7

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

<!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('header') {{ HTML::style('css/planesaleing.css') }} {{ HTML::script('js/jquery-1.10.1.js') }} {{ HTML::脚本('js/search_Bar.js') }} {{ HTML::script('js/anotherjs.js') }} {{ HTML::script('js/yetanotherjs.js') }} @show

然而,只有第一个实际上扩展了标题,之后的所有其他似乎都被忽略了。反正有使用多个扩展吗?

任何建议 - 非常感谢。

4

1 回答 1

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 不是子视图,而是可以从您的视图中填充的占位符。

让我换一种说法。当您的视图扩展模板时,它们将填补模板中声明的空白。因此,每个“标题”、“搜索栏”等都是要填补一次的空白。所以如果你有一个名为 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

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

于 2013-08-24T18:55:16.237 回答