布局文件:
views/layouts/main.php 主要包括页面显示的头部(导航栏),尾部(footer)
一、自定义布局文件的使用:
① 在controller的action中添加:
$this->layout = '指定的布局文件';//不需要加php后缀名
不同的action可以指定各自的布局文件。
② 让所有的action使用同一个布局文件:
在controller中直接添加属性:
public $layout = '统一的布局文件’;//不需要加php后缀名
或 在controller初始化方法中定义:
public function init(){
parent::init();
$this->layout ='main';
}
③ 不定义,则使用默认布局文件:
查找顺序如下:
先查看当前Controller中是否定义布局变量;
如果有就直接使用,否则会查找其所在Module模型中定义的布局变量;
如果还没有,会查找改module的父类Module中定义的布局变量;
④ layout变量的空值:
a. false,不使用布局文件;
b. null,使用当前module模块中的布局文件;
⑤ layout变量的值:与查找view文件类似
a.‘main’ //直接用字符串,表示当前module的布局文件
b. @app/views/layouts/main.php //别名
c.‘/main’ //加斜杠表示当前app下的布局文件
注意,布局文件可以层层嵌套,比如当前有个test.php的布局文件
里面写法是:
<?php $this->beginContent('@app/views/layouts/main.php',['需要传递的变量' => 变量值]);?>
<div>......</div>
<?php echo $content ?>
<?php $this->endContent(); ?>
其工作过程是:view文件render过来产生的content变量,先在这个test.php中渲染,
渲染的结果又作为一个新的content在当前app下的main.php布局文件中渲染;
二、布局的更高级用法:
yii2默认只能在布局文件中接收一个名称为$content的变量,这个变量是render指定的view文件产生的;
现在可以通过在view文件中写以下代码传递多个变量给布局文件渲染:
<?php
$this->blocks['content'] = '';
$this->blocks['other'] = '';
?>
<?php InhritLayout::begin(['viewFile' => '@app/views/layouts/main.php']); ?>
<?php $this->beginBlock('contetn');?>
这里是指定的content需要传递的变量
<?php $this->endBlock(); ?>
<?php $this->beginBlock('other');?>
这里是额外要在布局文件中渲染的东西
<?php $this->endBlock(); ?>
<?php InhritLayout::end(); ?>
最后在布局文件中,获取。
详细参考:
http://github.com/yiifans/lulucms/blob/master/components/widgets/InhriLayout.php