有谁知道是否可以延长儿童刀片?
我的应用程序有一个通用布局模板,然后每个页面@extends。每个页面都可以根据需要为其他 HTML 块(例如模态)引入一系列 @include。
@extends('common.layout')
@section('content')
... Some other content ...
@include('modals.modal-1')
@include('modals.modal-2')
@endsection
Run Code Online (Sandbox Code Playgroud)
所有的模态都有很多通用的样板代码(Bootstrap),所以我想要做的是定义一个主模型模板,从那里得到所有模态@extend,然后根据需要在我的页面中@include那些。所以 /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
Run Code Online (Sandbox Code Playgroud)
每次我尝试时,生成的 HTML 都会损坏。在上述情况下,modal-1 将显示两次,因为它首先出现,而 modal-2 根本不存在。翻转顺序,modal-2 会出现两次。
我想我可以简单地将我的模态体放在一个变量中并在 @include 语句中使用它@include('modal.blade', ['body' => '<div>...</div>']),但使用 @extends 感觉更正确。
有任何想法吗?
您绝对可以从已经扩展的视图中扩展 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
Run Code Online (Sandbox Code Playgroud)
在这种情况下,您将返回子视图,它还将包含其上方的两代模板。但是您永远无法返回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
Run Code Online (Sandbox Code Playgroud)
显然,您会将每个 yield 语句放在页面上有意义的地方。
但是,如果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
Run Code Online (Sandbox Code Playgroud)
我相信包含已经扩展了其他一些模板的模板的正确方法是@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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6026 次 |
| 最近记录: |