如何为Yii模块中的所有控制器设置布局?

时间:2013-08-02 10:46:47

标签: yii yii-modules

在我的Yii应用程序中,我有一个名为admin的模块,因此模块类是AdminModule,它扩展了CWebModule类,位于AdminModule.php文件中。根据文档,CWebModule具有layout属性,如果控制器本身没有定义任何布局,则在所有模块控制器之间共享。

我的控制器没有定义任何布局,在AdminModule.php中我把它:

$this->layout='webroot.themes.bootstrap.views.layouts.column2';
$this->layoutPath = Yii::getPathOfAlias('webroot.themes.bootstrap.views.layouts');

但是,管理模块中的控制器仍在使用其他布局,我认为它是在components目录中的Controller.php中定义的。这是为什么?如何为特定模块设置共享布局?

5 个答案:

答案 0 :(得分:5)

解决方案是稍微更改我的代码,如下所示:

$this->layoutPath = Yii::getPathOfAlias('webroot.themes.bootstrap.views.layouts');
$this->layout = 'column2';

与指定的路径一样,我不需要为布局指定整个路径别名。我在AdminModule.php的init()函数中有这些行,它工作正常。

答案 1 :(得分:1)

尝试设置布局路径,如下所示

$this->layout="webroot/themes/bootstrap/views/layouts/column2";

答案 2 :(得分:0)

解决方案是在模块中的beforeControllerAction上设置布局。它应该工作。 我已经回答了类似的问题,请参考它 Yii module layout

答案 3 :(得分:0)

如果同时使用Module和Theme(如bootstrap),则表示Yii首先会在Theme文件夹中找到视图文件(包括布局文件,特殊视图文件),CController中有一个名为resolveViewFile的重要函数,您可以在此处添加调试点以了解其工作原理,以下是我的解决方案:

1。我有一个名为" admin"。

的模块

2。在AdminModule的init函数中,添加:

$this->layout = 'column2'; 

3。删除模块的所有视图文件到主题文件夹

答案 4 :(得分:0)

您可以将以下代码放入控制器中。

public function init()
{
    Yii::$app->setLayoutPath($this->module->getBasePath().'/views/layout');
}

或者您可以将以下代码放在模块引导类

public function init()
{
    parent::init();

    Yii::$app->setLayoutPath($this->getBasePath().'/views/layout');
}