在控制器中设置布局会出现错误


Setting layout in controller brings up error

我目前正在尝试为多个主题设置控制器。为此,我需要yii检查文件夹中应用程序的名称,而不仅仅是指向我知道名称的文件夹(用户可以生成主题,所以它必须这样工作)。每个主题都有自己的布局和视图文件夹。

让我的登录表单为我必须使用的每个主题工作;

 public function actionIndex() {
        $this->render('webroot.themes.'.Yii::app()->name.'.views.site.index');
    }

这是有道理的,它查看主题内部并找到我需要的视图。

我遇到的问题是,当我试图将控制器指向特定布局时,会出现错误。

public $layout ='webroot.themes.'.Yii::app()->name.'.views.layouts.column2';

否则我该怎么做?如果我从代码中删除Yii:App()位,它会起作用,但否则我将如何获得生成的文件夹名称?

谢谢。

编辑。我更改了配置以查看

layout'=>'webroot.themes.thetheme.views.layouts.main',
            'viewDir' => 'webroot.themes.thetheme.views', // the path to view files to use with this module.
            //'defaultLayout' => 'application.views.layouts.column2',
            'defaultLayout' => 'webroot.themes.thetheme.views.layouts.column2',

但仍然没有运气。

另一次编辑。

通过在中添加第一行,我可以使一页正常工作

 public function actionIndex() {
        $this->layout = 'webroot.themes.'.Yii::app()->name.'.views.layouts.main';
        $this->render('webroot.themes.'.Yii::app()->name.'.views.site.index');
    }

但必须有一个更好的解决方案,而不是对每个动作、每个控制器都这样做。

如果您使用主题,您应该执行以下

Yii::app()->theme = Yii::app()->name;
$this->layout = '//layouts/main';
$this->render('index');

如果你想在任何地方都有这个主题,最好的方法是重新声明每个控制器的init函数

public function init(){
  parent::init();
  Yii::app()->theme = Yii::app()->name;
}

我很确定在成员初始化期间还没有设置Yii::app()->name。这似乎是完成的最佳方式

public function actionIndex() {
    $this->layout = 'webroot.themes.'.Yii::app()->name.'.views.layouts.main';
    $this->render('webroot.themes.'.Yii::app()->name.'.views.site.index');
}

您也可以尝试添加构造函数,以避免在每次操作中设置它:

function __construct() {
   parent::__construct();
   $this->layout = 'webroot.themes.'.Yii::app()->name.'.views.layouts.main';

}