Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何设置Yii模块中所有控制器的布局?_Yii_Yii Modules - Fatal编程技术网

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

如何设置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

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

我的控制器没有定义任何布局,在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上不起作用。如果它与你一起工作,那将是一件好事,因为它解决了你的问题。