在我的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中定义的。这是为什么?如何为特定模块设置共享布局?
答案 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');
}