为什么Yii模块找不到系统视图


Why Yii module does not find system views?

应用程序内主配置:

'errorHandler'=>array(
    // use 'site/error' action to display errors
    'errorAction'=>'site/default/error',
),

在/protected/modules/site/controllers/I中,有DefaultController.php操作错误:

public function actionError()
{
    if($error=Yii::app()->errorHandler->error)
    {
        if(Yii::app()->request->isAjaxRequest)
            echo $error['message'];
        else
            $this->render('error', $error);
    }
}

但如果我有错误,我会看到:

DefaultController cannot find the requested view "error". (/home/web/framework/web/CController.php:897)

0 /home/web/framework/web/CController.php(800): CController->renderPartial('error', Array, true) 1 /home/web/apps/myapp/protected/modules/site/controllers/SiteController.php(67): CController->render('error', Array) 2 /home/web/framework/web/actions/CInlineAction.php(50): SiteController->actionError() 3 /home/web/framework/web/CController.php(309): CInlineAction->runWithParams(Array) 4 /home/web/framework/web/CController.php(287): CController->runAction(Object(CInlineAction)) 5 /home/web/framework/web/CController.php(266): CController->runActionWithFilters(Object(CInlineAction), Array) 6 /home/web/framework/web/CWebApplication.php(283): CController->run('error') 7 /home/web/framework/base/CErrorHandler.php(332): CWebApplication->runController('site/site/error') 8 /home/web/framework/base/CErrorHandler.php(205): CErrorHandler->render('error', Array) 9 /home/web/framework/base/CErrorHandler.php(130): CErrorHandler->handleException(Object(CHttpException)) 10 /home/web/framework/base/CApplication.php(713): CErrorHandler->handle(Object(CExceptionEvent)) 11 [internal function]: CApplication->handleException(Object(CHttpException))

在Yii文档中:CErrorHandler按以下顺序搜索与视图对应的视图文件:

1.WebRoot/themes/ThemeName/views/system:这是当前活动主题下的系统视图目录。

2.WebRoot/protected/views/system:这是应用程序的默认系统视图目录。

3.yii/framework/views:这是yii框架提供的标准系统视图目录。

为什么Yii在使用模块时无法在Yii/framework/views中找到视图?

错误处理程序将Error操作作为参数,而不是Errorview

此外,错误消息也很清楚,即DefaultController找不到视图。

使用模块时,请将视图放在模块目录中,而不是主yii视图文件夹中。在您的情况下,错误视图应该在/protected/modules/site/views/default/error.php中,更一般地说:/protected/modules/<moduleId>/views/<controllerId>/<viewName>.php

要访问根视图,请使用//。从有关视图名称解析的文档

根据视图文件的名称查找视图文件。视图名称可以采用以下格式之一:

  • 模块中的绝对视图:视图名称以单斜杠"/"开头。在这种情况下,将在当前活动模块的视图路径下搜索视图。如果没有活动模块,将在应用程序的视图路径下搜索该视图
  • 应用程序中的绝对视图:视图名称以双斜杠"//"开头。在这种情况下,将在应用程序的视图路径下搜索该视图。此语法从1.1.3版本开始提供
  • 别名视图:视图名称包含点并引用路径别名。视图文件是通过调用YiiBase::getPathOfAlias()来确定的。请注意,别名视图无法设置主题,因为它们可以引用位于任意位置的视图文件
  • 相对视图:否则。将在当前活动的下搜索相对视图控制器的视图路径

对于绝对视图和相对视图,对应的视图文件是PHP文件其名称与视图名称相同。该文件位于指定的目录下。此方法将调用CApplication::findLocalizedFile来搜索本地化文件(如果有的话)。

注意:这仅适用于控制器视图。