1

好的,我在 Yii 中有一个控制器类,除了使用其默认视图文件夹之外,我还想使用不同的视图文件夹。

自然行为是当$this->render("<view file>");您使用以下内容在项目中导航您的视图文件时......

"//" 导航项目默认视图文件夹

“/”导航当前主题视图文件夹

或者不使用任何东西在控制器的默认视图文件夹中自动选择视图

但我的问题是我没有呈现视图文件,而是呈现驻留在某个视图文件夹的文件夹中的静态页面。/pages我要导航的静态页面是驻留在我当前主题文件夹视图中的静态页面,但默认是控制器导航/protected/view文件夹内的静态页面

我也尝试过这个覆盖来修改控制器的视图文件夹。我将此代码放在我想在主题文件夹中呈现静态页面的控制器中

public function init(){
    $this->layout = "//layouts/script";
    $this->viewPath = "/js";
}

但问题是 viewPath 是只读变量。

现在我的问题是如何渲染驻留在当前主题的视图文件夹中的静态页面?

注意:如果您不理解我的问题,请不要投反对票。我愿意改变并尽可能为你解释我的问题

4

3 回答 3

4

当您以某种方式覆盖 中的actions方法时SiteController,您需要更改CViewActionbasePath属性。正如文档所说,它默认为页面。

你能试试这样的东西吗?

 public function actions()
 {
     return array(
        'page'=>array(
            'class'=>'CViewAction',
            'basePath'=>'path/to/your/theme/folder'
        ),
     );
 }
于 2012-05-31T06:43:42.947 回答
1

为自己创建一个辅助类并声明此方法(更改文件路径和其他内容):

public static function renderInternal($_viewFile_, $_data_ = null, $_return_ = false) {
        // we use special variable names here to avoid conflict when extracting data
        if (is_array($_data_)) {
            extract($_data_, EXTR_PREFIX_SAME, 'data');
        } else {
            $data = $_data_;
        }

        $viewsDir = '/protected/views/internals/';

        if ($_return_) {
            ob_start();
            ob_implicit_flush(false);
            require(getcwd() . $viewsDir . $_viewFile_ . '.php');
            return ob_get_clean();
        } else {
            require(getcwd() . $viewsDir . $_viewFile_ . '.php');
        }
    }

使用它/调用它:

MyHelperClass::renderInternal( 'myviewfile', array( /* YOUR DATA */ ), /* RETURN CONTENTS OR NOT */ )

注意:更改$viewsDir为您想要的目录。

于 2012-05-31T04:09:03.410 回答
1

在您的任何站点控制器或任何控制器中尝试此操作..

 public function actions()
    {
        return array(
            'page'=>array(
                'class'=>'CViewAction',
            ),
        );
    }

或参考此链接...

http://www.yiiframework.com/wiki/22/how-to-display-static-pages-in-yii/
于 2012-05-31T05:19:17.973 回答