YII如何处理自定义404错误页面以及其他错误页面


YII how to handle custom 404 error page along with other error pages

我想显示404错误页面,因为我在受保护的/view/system文件夹中创建了error404.php文件。

默认情况下,我有Sitecontroller,它包含错误操作功能,如下所示

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

在主配置文件中,它被定义为

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

我的问题是我只需要自定义404页面,其余的错误我需要按照sitecontroller的错误函数处理的方式处理。但我找不到办法。如果假设我从config main中删除"errorAction"=>"site/error",那么它确实会通过调用显示404错误

        throw new CHttpException(404, 'Page not found');

但这样我只能看到没有布局的页面,其他自定义错误也被视为404,而不是。我看了很多次手册,但还是解决不了。

将此代码用于操作错误:

$app = Yii::app();
if( $error = $app->errorHandler->error->code )
{
    if( $app->request->isAjaxRequest )
        echo $error['message'];
    else
        $this->render( 'error' . ( $this->getViewFile( 'error' . $error ) ? $error : '' ), $error );
}

在视图/站点中,为404个错误创建error404.php,为其余的创建error.php

或者,您可以在配置中为您喜欢以不同方式处理的错误定义param,并根据它检查错误代码:

$app = Yii::app();
if( $error = $app->errorHandler->error->code )
{
    if( Yii::app()->request->isAjaxRequest )
        echo $error['message'];
    else    
        $this->render( 'error' . ( in_array( $error, $app->params[ 'customErrorPages' ] ) ? $error : '' ), $error );
}

错误处理程序的工作方式如下:当httpexception出现时,组件将检查errorAction属性中是否有任何值,如果有,将运行此控制器的操作。如果errorAction属性没有设置值,将显示系统文件夹中的错误视图。因此,不需要混合系统视图文件夹和控制器视图文件夹中的错误视图。

每当发生错误时,都会调用siteController中的操作错误。你可以在该操作中自定义错误路径,你可以做这样的事情:

if(404==Yii::app()->errorHandler->error->code){
     //go to custome error page
else
   //code default error.php

你不能用.htaccess来做这件事吗?就我个人而言,我创建了一个"errors"文件夹,其中包含所有保存错误消息的htmlphp文件,并修改.htaccess以在遇到错误时调用这些页面。

链接

http://www.javascriptkit.com/howto/htaccess2.shtml

http://www.addedbytes.com/for-beginners/error-documents-for-beginners/

示例

在您希望调用错误页面的目录中创建一个.htaccess文件,并在文本文件中写入以下行:

ErrorDocument 404     /404.html

假设同一目录中有一个名为404.html的页面,当生成404页面未找到错误时,将调用404.html页面。

同样适用于其他错误代码:

ErrorDocument 500     /500error.html

假设创建了一个500错误,并且同一目录中存在一个500error.html文件。

在最新版本的框架中(我使用的是1.14)使用:

Yii::app()->errorHandler->error['code']

因为错误是一个数组。