yii2之layout布局篇

来源:互联网 发布:js弹出警告窗口 编辑:程序博客网 时间:2024/05/29 10:16

在做网站的过程中,大部分的页面结构都是相似的。如都有相同的头部和底部。各个页面这样仅仅是中间的部分不同。

Yii中的布局文件就是用来实现这样的功能。如:

布局文件:@app/views/layouts/main.php


<!-- 前后的html 、head、body代码就省略了,只看最主要的部分 --><header></header><div class="wrap">  <div class="container">    <!-- $content变量的值 就是子页面渲染之后的代码。也就是说子页面中的内容将输出到这个地方-->    <?= $content ?>  </div></div><footer class="footer"></footer>
后台action:

public function actionIndex(){    $this->layout='@app/views/layouts/main.php';    return $this->render('index');}

执行顺序为:

  • 先想找index视图文件,
  • 渲染index视图文件 作为变量$output
  • 查找布局文件@app/views/layouts/main.php
  • 如果找到,则把$output值作为变量$content传递到布局文件
  • 把渲染后的布局文件作为结果返回
  • 如果没有找到布局文件,直接把$output作为结果返回

上面这个布局就是一列布局的页面,现在我们再增加另外一个布局:页面显示2列,左侧显示主要的内容,右侧显示统计信息。这个时候怎么办,再写一个和上面基本完全一样的代码吗?

布局文件嵌套(小部件:ContentDecorator)

这个小部件就是专为此功能而生的。

它的功能就是把begin和end之间的内容作为变量$content的值,然后渲染指定的视图文件。

两列布局文件:@app/views/layouts/column_2.php

<!-- 先引用main.php布局文件, --><?php $this->beginContent('@app/views/layouts/main.php');?><div class="left_column">  <?= $content ?></div><div class="right_column"><!-- 在右侧共用的统一数据 --></div><?php $this->endContent();?>

把上面的action改为:
public function actionIndex(){    $this->layout='@app/views/layouts/column_2.php';    return $this->render('index');}

执行顺序为:

  • 先把视图index渲染之后的结果作为变量 $content 传递到布局文件column_2中
  • 再把布局文件column_2中的 beginContent 和 endContent 之间的内容作为变量 $content 传递到布局文件 @app/views/layouts/main.php 中
  • 最后把main.php文件的结果输出。

注意: 在上面布局文件column_2中,在 beginContent 和

endContent

之外的内容是不会显示。

因此Yii中布局文件可以通过ContentDecorator小部件进行无限的嵌套。当然要小心点,不要弄成死循环了,如:ayout1引用layout2,layout2引用layout1文件

到现在你以为本文就结束了吗?终极技巧解密才刚刚开始!!!!!

多变量继承

先给你们看一个实例:

布局文件maiin:app/views/layouts/main.php

<header></header><div class="wrap">  <div class="container">    <?= $content ?>  </div></div><footer class="footer">  <div>      <?= $footer ?>  </div></footer>

可以看到,里面有两个变量: $content 和

$footer

布局文件columns_2:@app/views/layouts/columns_2.php
<?php AreaDecorator::begin(['viewFile'=>'@app/views/layouts/main.php'])?>  <?php Block::begin(['id' =>'content']);?>    <div class="main_column">      <?= $mainData ?>    </div>    <div class="side_column">      <?= $sideData ?>    </div>  <?php Block::end();?>  <?php Block::begin(['id' =>'footer']);?>    <div>footer data </div>  <?php Block::end();?><?php AreaDecorator::end();?>

布局文件columns_2引用main,并通过 Block 的

id

指定main里面的两个变量的内容

布局文件columns_3:@app/views/layouts/columns_3.php

<?php AreaDecorator::begin(['viewFile'=>'@app/views/layouts/columns_2.php'])?>  <?php  Block::begin(['id' =>'mainData']);?>    <div class="main_column_left">      <div>main column left data</div>    </div>    <div class="main_column_right">      <div><?= $content ?></div>    </div>  <?php Block::end();?>  <?php Block::begin(['id' =>'sideData']);?>    <div class="side_column">      side data    </div>  <?php Block::end();?><?php AreaDecorator::end();?>

这个和上面的类似

action使用:

public function actionIndex()    {            $this->layout='@app/views/layouts/columns_3.php';        return $this->render('index');    }


在布局中可以定义多个点位符变量,然后在各个子布局中指定所使用的内容。

现在再也不用担心Yii布局里面只提供一个

$content

变量了

下面就是实现这个功能的小部件类

AreaDecorator小部件类:

class AreaDecorator extends Widget{  public $viewFile;    public $params = [];  public $ids=[];      public function init()  {    if ($this->viewFile === null) {      throw new InvalidConfigException('ContentDecorator::viewFile must be set.');    }    ob_start();    ob_implicit_flush(false);  }  public function run()  {    $params = $this->params;    $params['content'] = ob_get_clean();        $blocks = $this->view->blocks;    if(count($this->ids)>0)    {      foreach ($blocks as $id=>$block)      {        if(in_array($id,$this->ids))        {          $params[$id]=$block;          unset($this->view->blocks[$id]);        }      }    }    else     {      foreach ($blocks as $id=>$block)      {        $params[$id]=$block;        unset($this->view->blocks[$id]);      }    }        echo $this->view->renderFile($this->viewFile, $params);  }}


0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 鼻子火辣辣的光想流鼻涕怎么办? 三岁宝宝鼻塞流鼻涕怎么办 一岁宝宝感冒流鼻涕鼻塞怎么办 1岁宝宝鼻塞流鼻涕怎么办 一岁多宝宝感冒鼻塞流鼻涕怎么办 宝宝鼻塞流鼻涕怎么办速效办法 八个月宝宝感冒流鼻涕鼻塞怎么办 7岁儿童流清鼻涕怎么办 1岁的宝宝流鼻涕怎么办 3岁宝宝鼻塞严重怎么办 宝宝流鼻涕2个月怎么办 一个月宝宝流鼻子怎么办 六个月宝宝流清水鼻涕怎么办 婴儿流鼻涕怎么办最简单方法 婴儿咳嗽流鼻涕怎么办最简单方法 6个月小孩流鼻涕怎么办 宝宝风寒感冒咳嗽流鼻涕怎么办 三个月宝宝流清鼻涕怎么办 三个月宝宝留清鼻涕怎么办 三个月婴儿流清鼻涕怎么办 宝宝7个月流鼻涕怎么办 6个月孩子流鼻涕怎么办 十一个月孩子感冒流鼻涕怎么办 7个月孩子流鼻涕怎么办 18个月的宝宝流鼻涕怎么办 6个月宝宝咳嗽流鼻涕怎么办 18个月宝宝咳嗽流鼻涕怎么办 6个月宝宝流鼻涕打喷嚏怎么办 宝宝18个月流鼻涕怎么办 18个月宝宝感冒流鼻涕怎么办 小孩睡觉鼻子不通气怎么办 宝宝鼻子里有鼻涕出不来怎么办 孩子喉咙有痰呼呼响怎么办 六个月宝宝鼻塞怎么办速效办法 两个月小孩鼻子不通气怎么办 一岁宝宝流清鼻涕怎么办 孩子鼻子里有鼻涕怎么办 宝宝晚上睡觉鼻子不通气怎么办 宝宝感冒睡觉鼻子不通气怎么办 宝宝3个月流鼻涕怎么办 小孩吃着了发烧怎么办