【问题标题】:Same section name in blade inherited templates刀片继承模板中的相同部分名称
【发布时间】:2016-07-04 13:29:12
【问题描述】:

假设我有三个刀片模板:A、B 和 C。模板 A 是全局布局,模板 B 是某些特定部分的布局,模板 C 是视图模板。

模板 A 和 B 期望分配一个名为 content 的部分。该部分在视图模板 (C) 中定义。

这是模板 A 和 B 的简化版本:

模板 A:

<html>
  <body>
    @yield('content')
  </body>
</html>

模板 B:

@extends('template_a')

@section('content')
<div class="sidebar">
  ...
</div>
<div class="content">
  @yield('content')
</div>
@endsection('content')

如您所见,两个模板都输出content 部分。我的问题是,在扩展 B 的视图中,它的内容被简单地忽略了。视图中定义的content 部分在模板A 中的@yield('content') 上输出。

我想知道是否可以在视图层次结构中向上传播 content 部分,即将模板 B 中的内容占位符替换为模板 C 中定义的值,并将结果替换为 content模板 A 中的占位符。

对不起,如果我把这听起来太混乱了。我希望你能明白我的想法。

提前致谢。

【问题讨论】:

  • 你试过@parent指令吗?
  • 我已经看过并尝试过,但无法让它做我想做的事。我认为@parent 与我想要的相反。我希望能够将孩子的内容放在父视图中,而不是相反。

标签: laravel blade laravel-blade


【解决方案1】:

只需在模板 B 中重命名 @yield('content')@endsection (Laravel5) 足以结束这些部分。

模板 A:

<html>
  <body>
    @yield('body')
  </body>
</html>

模板 B:

@section('body')
   <div class="sidebar">
      ...
   </div>
   <div class="content">
      @yield('content')
   </div>
@endsection

模板 C:

@section('content')
    <!--yourContent-->
@endsection

这样您就可以轻松地用任何其他给定的模板更改模板 B 以修改正文(即模板 D):

@section('body')
   <!-- Some different Body Style -->
      @yield('content')
@endsection

以及您的内容(即模板 E):

@section('content')
    <!--some different Content-->
@endsection

编辑:

可能模板 B 没有显示模板 C 中的任何数据的原因是模板 B 导致的无限循环:每次调用 section('content') 时,您也会 yield('content') 并将模板 B 插入到自身中.

【讨论】:

  • 我想不出一个好的答案,但我反对你的答案蒂姆。如果 OP 想要从 B 扩展模板 C 以外的内容,他将不得不重命名所有这些模板。它有效,但有点草率,迫使他改变所有其他观点。话虽如此,您的帖子是一个解决方案,但 OP 看看它是否适合您,如果您不介意这种类型的代码
  • @alaboudi 总而言之,我不能同意你的看法。 yield 的主要原因是保持代码 DRY。您可以轻松切换身体或内容。但出于这个原因,您需要一个唯一标识符(产量的值)。如果您没有 B 的替代模板,我认为没有理由使用收益率。相反,包含或使用相同的 php 文件就可以了。编辑了我的帖子以获取更多示例。
  • 感谢您的 cmets。我的目标是能够在不改变主视图的情况下扩展 A 或 B。这就是为什么他们都有部分名称content
【解决方案2】:

我在这里找到了您问题的答案:https://laracasts.com/discuss/channels/laravel/trouble-with-blade-section-inheritance?page=1

诀窍是在具有相同名称的@section 中包含@yield 的刀片中使用@overwrite 而不是@endsection。

@extends('app')
@section('content')
    {{--Some common code--}}
    @yield('content')
@overwrite

使用@endsection 会导致生成的视图覆盖中间视图,但使用@overwrite 会强制包含。

在我看来,令人困惑的是,在常规编程中,使用超类方法的指令放在子类中(从子类调用超类方法),而在 Laravel 刀片继承中,它必须放在超类中自身(超类在自身内部声明,在被覆盖时不能忽略它)。

【讨论】:

  • 一旦我们知道用@parent 调用超类是可能的,就不会那么混乱了,但是使用它我们只能包含超类的代码(完全像编程),而不是OP 需要的。
猜你喜欢
  • 2019-05-16
  • 2016-05-12
  • 2015-05-25
  • 2014-09-04
  • 1970-01-01
  • 2020-07-10
  • 2013-09-21
  • 2014-11-13
  • 1970-01-01
相关资源
最近更新 更多