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