如何设置Yii模块中所有控制器的布局?
在我的Yii应用程序中,我有一个名为admin的模块,因此模块类是AdminModule,它扩展了CWebModule类,位于AdminModule.php文件中。根据文档,CWebModule有一个如何设置Yii模块中所有控制器的布局?,yii,yii-modules,Yii,Yii Modules,在我的Yii应用程序中,我有一个名为admin的模块,因此模块类是AdminModule,它扩展了CWebModule类,位于AdminModule.php文件中。根据文档,CWebModule有一个布局属性,如果控制器本身未定义任何布局,则该属性在所有模块控制器之间共享 我的控制器没有定义任何布局,在AdminModule.php中,我放了以下内容: $this->layout='webroot.themes.bootstrap.views.layouts.column2'; $this
布局
属性,如果控制器本身未定义任何布局,则该属性在所有模块控制器之间共享
我的控制器没有定义任何布局,在AdminModule.php中,我放了以下内容:
$this->layout='webroot.themes.bootstrap.views.layouts.column2';
$this->layoutPath = Yii::getPathOfAlias('webroot.themes.bootstrap.views.layouts');
然而,我在管理模块中的控制器仍然使用其他一些布局,我认为它是在components目录中的Controller.php中定义的布局。为什么呢?如何设置特定模块的共享布局?解决方案是在模块中的beforeControllerAction上设置布局。它应该会起作用。 我已经回答了类似的问题,请参考
尝试设置布局路径,如下所示
$this->layout="webroot/themes/bootstrap/views/layouts/column2";
解决方案是稍微更改我的代码,如下所示:
$this->layoutPath = Yii::getPathOfAlias('webroot.themes.bootstrap.views.layouts');
$this->layout = 'column2';
与指定的路径一样,我不需要为布局指定整个路径别名。我在AdminModule.php的init()函数中有这些行,它工作得很好。如果同时使用模块和主题(如引导),这意味着我将在主题文件夹中找到视图文件(包括布局文件,一个特殊的视图文件)。首先,CController中有一个名为resolveViewFile的重要函数,您可以在此基础上添加调试点以观察其工作方式,下面是我的解决方案: 一,。我有一个名为“admin”的模块 二,。在AdminModule的初始化函数中,添加: $this->layout = 'column2'; $this->layout='column2';
三,。将模块的所有视图文件删除到主题文件夹您可以将以下代码放入控制器中
public function init()
{
Yii::$app->setLayoutPath($this->module->getBasePath().'/views/layout');
}
或者,您可以将以下代码放入模块引导类中
public function init()
{
parent::init();
Yii::$app->setLayoutPath($this->getBasePath().'/views/layout');
}
谢谢你的回复。看到我的答案了吗?这在init()中是可行的,我刚刚把代码搞错了。此外,我认为在
beforeControllerAction()
之前将此类内容放入在语义上是不正确的。我不确定,但我会使用此函数指定在触发控制器之前必须执行的操作,而不是进行一些配置更改。因为我查看了一些票据,其中一些人询问有关设置布局的问题,但这些票据在init上不起作用。如果它与你一起工作,那将是一件好事,因为它解决了你的问题。