PHP laravel 5.0 Blade 模板引擎 Api使用备注

 PHP laravel 5.0 Blade 模板引擎 Api使用备注

/**
* PHP laravel 5.0  Blade 模板引擎 Api使用备注
**/

//子模版中开头,调用@extends('wechat.layouts.base')
//表示当前子模版继承wechat/layouts/base.blade.php父模版,也就是把父模版插到这个子模版中
@extends('wechat.layouts.base')

//在父模版base.blade.php中,给子模版调用使用,占的页面位置空位
@section('base-css')
@show  //表示在这里输出显示


//当子模版调用base-css将include中的文件放到父模版的位置
@section('base-css')
    @include('wechat.link.patient.app')
@stop  //表示在这里进行内容解析,并结束后续对该section的处理


// @yield 和 @section 都可以预定义可替代的区块,这两者有什么区别呢?
// @section 可以用 @show, @stop, @overwrite 以及 @append 来结束,这三者又有什么区别呢?

/*
  首先,@yield 是不可扩展的,如果你要定义的部分没有默认内容让子模板扩展的,
  那么用 @yield($name, $default) 的形式会比较方便,
  如果你在子模板中并没有指定这个区块的内容,它就会显示默认内容,
  如果定义了,就会显示你定义的内容。非此即彼。

  与之相比, @section 则既可以被替代,又可以被扩展,这是最大的区别。比如:
*/

//父模版代码如下:
{{-- layout.master.blade.php --}}
@yield('title','默认标题')

@section('content')
  默认的内容
@show


//子模版代码如下:
{{-- home.index.blade.php --}}
@extends('layout.master')

@section('title')
@parent
  新的标题
@stop

@section('content')
@parent
  扩展的内容
@stop

/*
上面的例子中,父模板用 @yield 和 @section 分别定义了一个区块,
然后在子模板中去定义内容,由于 @yield 不能被扩展,所以即使加上了
 @parent 也不起作用,输出的内容只有“新的标题”,替换了“默认的标题”。
 因此最终生成的页面只能是“默认的标题”或者“新的标题”,不能并存。

 而 @section 定义的部分,由于使用了 @parent 关键字扩展,父模板中的内容会被保留,
 然后再扩展后添加的内容进去,输出的内容会是 “默认的内容 扩展的内容”。
*/

@parent //关键字,说的是默认行为是“扩展”
@show //指的是执行到此处时将该 section 中的内容输出到页面
@stop //则只是进行内容解析,并且不再处理当前模板中后续对该section的处理,除非用 @override覆盖

/*
通常来说,在首次定义某个 section 的时候,应该用 @show,
而在替换它或者扩展它的时候,不应该用 @show,应该用 @stop
下面用例子说明:
*/
//父模版
{{-- layout.master.blade.php --}}
<div id="zoneA">
	@section('zoneA')
	AAA
	@show
</div>

<div id="zoneB">
	@section('zoneB')
	BBB
	@stop
</div>

<div id="zoneC">
	@section('zoneC')
	CCC
	@show
</div>

//子模版
{{-- page.view.blade.php --}}
@extends('layout.master')

@section('zoneA')
  aaa
@stop

@section('zoneB')
  bbb
@stop

@section('zoneC')
  ccc
@show
/*
 在 layout.master 中,用 @stop 来结束 "zoneB",由于整个模板体系中,
 没有以 @show 结束的 "zoneB" 的定义,因此这个区块不会被显示。
 而在 page.view 中,用 @show 定义了 'zoneC',这会在执行到这里时立即显示内容,
 并按照模板继承机制继续覆盖内容,因此最终显示的内容会是:

 ccc // 来自 page.view
 <div class="zoneA">
  aaa
 </div>

 <div class="zoneB">
   zoneB由于没有@show结束的定义,所以不显示
 </div>

 <div class="zoneC">
  ccc
 </div>

 从结果可以看到,zoneB 的内容丢失,因为没有用 @show 告诉引擎输出这部分的内容,
 而 zoneC 的内容会显示两次,并且还破坏了 layout.master 的页面结构,因为 @show 出现了两次。

*/


@append 和 @override
/*
刚才说到了,@override 并不是在子模板中指明内容替换父模板的默认内容,而是另有用途,
那么是如何使用呢?这又涉及到一个 section 在模板中可以多次使用的问题。
也即我们所定义的每一个 section ,在随后的子模板中其实是可以多次出现的。比如:
*/

//父模版
{{-- master.blade.php --}}
<div>
  @yield('content')
</div>

//子模版
{{-- subview.blade.php --}}
@extends('master')

@section('content')
  加一行内容
@append

@section('content')
  再加一行内容
@append

@section('content')
  加够了,到此为止吧。
@stop

/*
在上例中,我在父级模板中只定义了一个名为 "content" 的 section,
而在子模板中三次指定了这个 section 的内容。 这个例子最终的输出是:
*/
<div>
	加一行内容
	再加一行内容
	加够了,到此为止吧。
</div>

/*
三次指定的内容都显示出来了,关键就在于 @append 这个关键字,它表明“此处的内容添加到”,
因此内容会不断扩展。而最后用了 @stop,表示这个 section 的处理到此为止。如果在后面继续用
@append 或者 @stop 来指定这个 section 的内容,都不会生效。除非用 @override 来处理。
@override 的意思就是“覆盖之前的所有定义,以这次的为准”。比如:
*/
{{-- master.blade.php --}}
<div>
    @yield('content')
    @yield('message')
</div>


{{-- master.blade.php --}}
<div>
  @section('content')
    加一行内容
    @append
    @section('content')
    再加一行内容
    @append
    @section('content')
    加够了,结束吧
    @stop
    @section('content')
    都不要了,我说的。
    @override
</div>

//这个例子和刚才的类似,只不过最后加了一组定义。最终的输出会是:
<div>
  都不要了,我说的。
</div>

//所以,在正式的项目中,有时候需要对数据进行遍历输出的,可以使用 @append,
//而如果遍历到了某个数据发现前面的都错了呢?用 @override 就可以全部推翻。

@include('b.bb')
//如果视图文件夹views下有文件夹a和b,a中有aa.blade.php,b中有bb.blade.php。
//如果要在aa.blade.php中包含bb,@include('b.bb')即可,其中的‘.’可以是'\'或'/'
 @include('wechat.scripts.component.media', ['container' => '要传的参数值'])
 //第一个参数为插入的模版路径,第二个参数为,子模版本的传参
 //子模版:<p>我是include {{ $container }}</p> == <p>我是include 要传的参数值</p>

  

参考:http://www.mb5u.com/biancheng/php/php_100436.html 

              http://www.jb51.net/article/60957.htm

posted @ 2018-03-26 18:14  MrZou  阅读(682)  评论(0编辑  收藏  举报