我目前正在尝试为多个主题设置控制器。为此我需要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');
}
但是,必须有一个更好的解决方案,而不是在每个控制器中为每个动作执行此操作。
答案 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;
}