配置布局变量 $layout
- 在Controller控制器里定义布局变量
直接添加一个公有变量:public $layout = '布局文件路径'
(默认起始路径是控制器所在目录下的views目录下的layouts文件夹)
举个栗子:public $layout = loginlayout
在LoginController控制器里头写了一个公共的布局变量,它的值为loginlayout
那么它指向的路径就是:views/layouts/loginlayout.php
- 如果是想在action里改变布局,那么就把变量写在里面
public function actionIndex(){
$this->layout = 'loginlayout';
}
- 通过控制器的init()方法去定义该变量
public function init(){
$this->layout = 'loginlayout';
parent::init(); // TODO: Change the autogenerated stub
}
- 同样也可以通过模块(Module)的init方法去定义$layout布局文件
不过这几种方法是有区别的。因为层次关系会由内到外去找布局文件,所以优先级是:2 > 3 > 1 > 4
layout变量的值
- $layout = false;
这种代表的是不使用布局文件 - $layout = null;
这种代表的是使用模块里定义的布局文件 - $layout = 'string';
该字符串代表的是一个布局文件路径
可以使用别名开头@app/Module/admin/views/layouts/loginlayout
使用/
开头则是指定app下面的views里面的layouts文件夹下的布局文件
直接使用布局文件的名字如:$layout = loginlayout
,则表示使用Module下的布局文件
此三种路径写法的源码如下:
if (strncmp($layout, '@', 1) === 0) {
$file = Yii::getAlias($layout);
} elseif (strncmp($layout, '/', 1) === 0) {
//echo Yii::$app->getLayoutPath() . DIRECTORY_SEPARATOR;exit();
$file = Yii::$app->getLayoutPath() . DIRECTORY_SEPARATOR . substr($layout, 1);
} else {
$file = $module->getLayoutPath() . DIRECTORY_SEPARATOR . $layout;
}
查找布局文件的原理
- 先看当前controller里面有没有定义布局文件
- 如果没有,查找所在Module里面有没有定义布局文件
- 查找父级Module里面有没有定义布局文件
布局文件的嵌套使用
<?php $this->beginContent('@app/views/layouts/main.php');?>//必须加.php
<?php echo $content;?>
<?php $this->endContent();?>