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

时间:2015-11-18 09:28:35

标签: php yii

我目前正在尝试为多个主题设置控制器。为此我需要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');
    }

但是,必须有一个更好的解决方案,而不是在每个控制器中为每个动作执行此操作。

2 个答案:

答案 0 :(得分:1)

我非常确定在成员初始化期间尚未设置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';

}

答案 1 :(得分:1)

如果您使用主题,则应执行以下操作

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;
}