Laravel Blade:@extend一个(已经扩展的)儿童刀片?

时间:2015-10-26 11:25:09

标签: php laravel blade

任何人都知道是否可以延长儿童刀片?

我的应用程序有一个通用的布局模板,然后每个页面@extends。 每个页面可以根据需要为其他HTML块提取一系列@includes(例如模态)。

@extends('common.layout')

@section('content')
    ... Some other content ...
    @include('modals.modal-1')
    @include('modals.modal-2')
@endsection

所有的模态都有很多常见的样板代码(Bootstrap),所以我想做的是定义一个主模型模板,从中扩展所有模态@extend,然后在我的页面中包含@需要。所以/modals/modal-1.blade.php看起来像是:

@extends('common.modals')

@section('modal-id', 'modal-1')
@section('modal-title','Modal title')

@section('modal-body')
    ... Some HTML / Blade here ...
@endsection

每次尝试时,生成的HTML都会损坏。在上面的例子中,modal-1会显示两次,因为它首先出现,而modal-2根本不存在。翻转顺序,模态-2将出现两次。

我想我可以简单地将我的模态体放在变量中并在@include语句@include('modal.blade', ['body' => '<div>...</div>'])中使用它,但使用@extends感觉更正确。

有什么想法吗?

2 个答案:

答案 0 :(得分:4)

您绝对可以从已扩展的视图中扩展Blade视图。但是,您正在混合模板继承与视图包含,这会导致您的奇怪结果。

使用@extend指令继承模板时,必须始终返回所需链上的最低子项。假设您有3代模板:

//grandparent.blade.php
<html>
<head>
    <title>My App</title>
</head>
<body>
    @yield('parent-content')
</body>
</html>

//parent.blade.php
@extends('grandparent')

@section('parent-content')
<div class="container">
    @yield('child-content')
</div>
@endsection

//child.blade.php
@extends('parent')

@section('child-content')
<div class="page">
    //stuff
</div>
@endsection

在这种情况下,您将返回子视图,它还包含它上面的两代模板。但是你可以从不返回parent.blade.php并期望它也返回那个子视图。可能有100个子视图扩展了父级,因此无法知道哪一个。

@include指令视为将视图中的HTML细分为较小位的一种方法。通常,您会将它用于要在多个视图中引用的可重用代码段。但它与模板继承不同。还要记住,包含的视图将获得与其父视图相同的所有数据(您甚至可以传递更多信息)。

在您的情况下,您必须确定构成页面基本根的内容。是modal-1页面的核心吗?如果是这样,您需要从您的控制器返回modal-1作为您的子视图并将其向上扩展。在这种情况下,请将文件保留在帖子中。其父视图(common.modals)需要更改为:

@extends('common.layout')

@section('content')
    ... Some other content ...

    @yield('modal-id')
    @yield('modals-title')
    @yield('modal-body')

    @include('modals.modal-2')
@endsection

显然,你会将每个屈服陈述放在页面上有意义的地方。

但是,如果modal-1 不是页面的核心,而只是您要包含的额外内容(如小部件),那么您应该include它就像你在父视图中一样。在这种情况下,您需要从中删除@extends指令,并且不打算将主HTML包装在任何部分中。它将按原样传递给视图。如果在包含的模板中包含节,则必须在包含它的视图中将这些节放到该节。因此,您的modal-1模板最终会显示如下:

<div>
    <p>HTML goes here. No need to extend anything or wrap in a section.
       You can still include {{$data}} though.
    </p>
</div>

@section('script')
    Including this section means that the view that is including this template
    already contains a @yield('script') directive.
    By including the @parent directive, this section will append that one.

@parent
@endsection

答案 1 :(得分:1)

我认为包含已扩展其他模板的模板的正确方法是使用@overwrite代替所包含模板中的@endsection

@extends('common.modals')

@section('modal-id', 'modal-1')
@overwrite
@section('modal-title','Modal title')
@overwrite

@section('modal-body')
    ... Some HTML / Blade here ...
@overwrite