【问题标题】:Laravel Blade - yield inside sectionLaravel Blade - 产生内部部分
【发布时间】:2017-01-07 00:47:15
【问题描述】:

我正在尝试在另一个部分中生成一个部分。但这并没有按预期工作,我看到空白输出。

@section('3show')
        This is a text string
@stop

@section('page-content')

<div id="content">
    <article>

        @yield('3show')

    </article>
</div>
<!--#content-->


@stop

有什么想法可以在另一个部分中产生部分吗?

【问题讨论】:

  • 那么您是否获得了第二个刀片模板,该模板从该文件扩展而来,并带有定义的@section('3show'),您调用该第二个文件并获得一个空白页?我理解对了吗?
  • @JulianRodriguez 是的!
  • @JulianRodriguez 有什么想法或替代方案吗?
  • 不,实际上我已经尝试过您的示例,因为它是在几分钟前,并且效果很好。我在@section('page-content') 之后复制了您定义@section('3show') 的问题。我相信这可以通过在页面内容定义之前定义您的部分来解决,并将您需要的第二个文件中的所有代码附加到“3show”部分,该文件扩展了此模板。
  • @JulianRodriguez 我也尝试过这种方式,但没有出现。所以暂时,我正在使用@include('partials'),当我为每个部分创建文件时,我发现它很蹩脚。从一开始,我就一直希望有像我的例子一样的东西,这样我就可以将所有的部分放在一个文件下并更容易地使用它。无论如何谢谢!

标签: laravel


【解决方案1】:

在我的项目中,我创建了一些部分代码以使代码更简洁,并以示例名称为它们命名:3show.blade.php。为了在一个部分中使用它们,我只包括它们。 我认为这会做你想做的。

@section('content')
    @include('3show.blade.php')
@endsection

【讨论】:

    【解决方案2】:

    好的,这就是我尝试过的,我可以确认它有效,至少对于 Laravel 5+(我有 L5.2)。这就是我建议您使用刀片模板的方式。

    让我们开始说,要将一个部分生成另一个部分,您必须在定义容器部分之前定义包含的部分。所以,很清楚,我这样解决了这种情况:

    我有一个主刀片 (main.blade.php) 模板,其中包含以下内容:

    <section class="content">
     <!-- Your Page Content Here -->
     @yield('main-content')
    </section><!-- /.content -->
    

    我得到了第二个刀片 (common.blade.php) 模板,其中包含您可能希望在许多页面中显示的常见内容以及定义主要内容部分的位置。这个看起来像:

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

    最后我得到了第三个模板(test.blade.php),它扩展了主模板并包含了我想展示的常见内容,但要小心,因为顺序很重要。这个看起来像:

    @extends('main')
    @section('extra-content')
      <div>
        <span> This is a test! </span>
      </div>
    @endsection
    @include('common')
    

    在您的控制器或路线中(无论您返回视图的位置),您都应该返回第三个模板。

    【讨论】:

    • P.S.我有问题的代码不适用于旧版本的 Laravel。我最近在 5.4 上试了一下,结果符合预期。
    【解决方案3】:

    假设你有两个文件:

    -article_base.blade.php -> 每篇文章的默认数据。

    -article_index.blade.php -> 自定义文件。

    article_base.blade.php
    @extends('layout')
    @section('page-content')
    
    <div id="content">
        <article>
            ....
            @yield('3show')
            ....
        </article>
    </div>
    <!--#content-->
    @stop
    

    article_index.blade.php

    @extends('article_base')
    @section('3show')
       This is a text string
    @endsection
    

    我希望这行得通

    【讨论】:

      【解决方案4】:

      您必须在主模板中同时 @include 和 @yield 子模板才能在主模板内的特定位置添加子模板(不仅仅是在主模板之前或之后 - 这是通过添加@parent 在子模板中 - 但介于两者之间):

      main.blade.php

      @include('child')
      <div>
           ...
           @yield('child')
      </div>
      

      child.blade.php

      @section('child')
           <div>
                ...
           </div>
      @endsection
      

      【讨论】:

        【解决方案5】:

        解决方案 1: 您可以在部分末尾使用@show 而不是@stop 然后 laravel 会渲染你的 @yield 部分...

        像这样:

        @section('page-content')
        
        <div id="content">
            <article>
        
                      @yield('3show')
        
            </article>
        </div>  
        
        @show  # not @stop
        
        
        
        
        @section('3show')
        
                This is a text string
        @stop
        

        以这种方式呈现您的视图并显示结果 因此,如果您两次关闭您的部分,那么结果将被淘汰两次

        解决方案 2:

        在 yiel 之前插入调用部分 像这样:

         **first call section :**
        
        @section('3show')
        
                This is a text string
        @stop
        
        **then define your section : 3show**
        
        
        @section('page-content')
        
        <div id="content">
            <article>
        
                      @yield('3show')
        
            </article>
        </div>  
        
        @stop  **not @show**
        

        【讨论】:

          【解决方案6】:

          我遇到了同样的问题。

          这种情况下不能使用@extends选项,需要使用@include。

          假设你有:

          1. 根布局 (layouts/app.blade.php)
          2. 额外的布局 (layouts/extra.blade.php)
          3. 您正在调用的实际视图 (someview.blade.php)

          解决方案是使用添加/继承根布局 (1) 到视图的顶行 (3):

          @extends('layouts.app')
          

          接下来,将额外的布局 (2) 添加/继承到视图的第二行,但使用 @include 而不是 @extends:

          @include('layouts.extra')
          

          ...记得将额外布局的内容包装在@section 名称中,例如 @section('extra')

          最后你可以从你的视图中调用你的额外布局内容:

            <p>Look below, you will see my extra content...</p>
            @yield('extra')
          

          总而言之,您的 someview.blade.php 视图如下所示:

          @extends('layouts.app')
          @include('layouts.extra')
          
          @section('content')
              <p>Look below, you will see my extra content...</p>
              @yield('extra')
          @endsection
          

          【讨论】:

            猜你喜欢
            • 2019-11-25
            • 1970-01-01
            • 2017-06-21
            • 1970-01-01
            • 2017-03-26
            • 2017-12-12
            • 2015-02-06
            • 2014-10-14
            • 2013-09-10
            相关资源
            最近更新 更多