想在 Blade 模板中使用多个 @yield ('content') 嵌套,需要怎么做

问题简述

我做的作品需要使用三个blade模板,其中①号为主视图,②号为页面视图,③号为模块视图。
①、②中有@yield('content'),且是嵌套关系,现在③中要扩展②的content页面
如果直接嵌套,②中的内容不会渲染。

我的代码

①:resources\views\layouts\app.blade.php

...
<div class="main-content">
            @include('layouts.navbars.navbar')
            @yield('content')
</div>
...

②:resources\views\ticketit\ticketit.blade.php

@extends('layouts.app')

@section('content')
    @include('layouts.headers.cards')
    <div class="container-fluid mt--7">
        ...
            @yield('content')
        ...
        @include('layouts.footers.auth')
    </div>
@endsection

③:由扩展包引入,指定ticketit.ticketit为父模板

以上模板渲染出来的视图中,没有包括②中的所有内容:

 @include('layouts.headers.cards')
    <div class="container-fluid mt--7">
        ...
            @yield('content')             //  <--除了这里其他都没有渲染
        ...
        @include('layouts.footers.auth')
    </div>

环境

①、③均由扩展包引入,我也不知道怎样才能解决
①是 Argon管理界面前端预设
③是 ticketit工单系统

非常感谢~

《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
最佳答案

解决了,感谢
@likunyan
给予了灵感,比心 :kissing_heart:

总的来说是这样的,为了后面的模板不会直接继承前面的模板,我们需要改一下@yield('content')的变量。但是如果直接在主视图改的话会造成其他的视图没法用。

那么,Google了一下,发现有办法判断section是否是空值。那么就通过section来做个判断吧orz

resources\views\layouts\app.blade.php

<!-- 解决ticketit继承问题 -->
...
@if(View::hasSection('tickets-content'))
    @yield('tickets-content')
@else
     @yield('content')
@endif
...

resources\views\ticketit\ticketit.blade.php

@extends('layouts.app')

@section('tickets-content')
    <div class="container-fluid mt--7">
        @yield('content')
        @include('layouts.footers.auth')
    </div>
@stop

虽然感觉不优雅,但是为了继续码代码只能先将就了。

如果大家有啥好方法欢迎分享,谢谢啦 :stuck_out_tongue_winking_eye:

4年前 评论
小李世界 4年前
讨论数量: 3
@yield('content')

没这么用过,不过稍微看一下,这个 content 貌似不要一样吧,变量名一样了,你改为不一样的试试。

4年前 评论

@likunyan 感谢回复~

把两个content修改成不一样的确实可以了,但是第一个文件①的@yield('content')和第三个文件③的@section('content')都是composer安装的扩展包里规定的,如果修改的话整个前端都要改动。

请问能否只修改②来实现呢?

4年前 评论

解决了,感谢
@likunyan
给予了灵感,比心 :kissing_heart:

总的来说是这样的,为了后面的模板不会直接继承前面的模板,我们需要改一下@yield('content')的变量。但是如果直接在主视图改的话会造成其他的视图没法用。

那么,Google了一下,发现有办法判断section是否是空值。那么就通过section来做个判断吧orz

resources\views\layouts\app.blade.php

<!-- 解决ticketit继承问题 -->
...
@if(View::hasSection('tickets-content'))
    @yield('tickets-content')
@else
     @yield('content')
@endif
...

resources\views\ticketit\ticketit.blade.php

@extends('layouts.app')

@section('tickets-content')
    <div class="container-fluid mt--7">
        @yield('content')
        @include('layouts.footers.auth')
    </div>
@stop

虽然感觉不优雅,但是为了继续码代码只能先将就了。

如果大家有啥好方法欢迎分享,谢谢啦 :stuck_out_tongue_winking_eye:

4年前 评论
小李世界 4年前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!