配置布局變量 $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();?>