【问题标题】:YII how to handle custom 404 error page along with other error pagesYII 如何处理自定义 404 错误页面以及其他错误页面
【发布时间】:2012-08-05 10:05:09
【问题描述】:

我想显示 404 错误页面,因为我在 protected/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 页面,其余的错误我需要处理站点控制器的错误函数处理的方式。但我找不到办法做到这一点。如果假设我从配置主目录中删除了 'errorAction'=>'site/error',那么它会通过调用

来显示 404 错误
        throw new CHttpException(404, 'Page not found');

但是这样做我只能看到没有布局的页面,其他自定义错误也被视为 404 而不是。我多次阅读手册但我仍然无法解决它。

【问题讨论】:

    标签: php yii http-status-code-404


    【解决方案1】:

    将此代码用于actionError

    $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

    或者您可以在配置中为您希望以不同方式处理的错误定义参数并检查错误代码:

    $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 属性没有设置值,将显示来自系统文件夹的错误视图。所以不需要混合来自系统视图文件夹和控制器视图文件夹的错误视图。

    【讨论】:

    • 我不得不把它改成这个 if( $error = Yii::app()->errorHandler->error['code'] ) error->code 给了我错误。 getViewFile 也给了我这个错误。 CWebApplication and its behaviors do not have a method or closure named "getViewFile". (/Applications/XAMPP/xamppfiles/htdocs/wm/common/lib/yii/framework/base/CComponent.php:266) 有什么想法吗?
    • error->code 的错误消息是 Notice: Trying to get property of non-object in /Applications/XAMPP/xamppfiles/htdocs/wm/backend/controllers/SiteController.php on line 48 @Boris
    • 你是对的。 app 类中没有 getViewFile 方法。应该调用控制器的方法:$this->getViewFile(...)
    【解决方案2】:

    每当发生错误时,都会调用 siteController 中的操作错误。您可以在该操作中自定义错误路线,您可以执行以下操作:

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

    【讨论】:

    • 您的意思是在错误视图中提供 if then else 条件,然后相应地添加部分视图? (我认为如果我在系统目录中使用error404.php,它应该是自动的。???
    • 是的..我不确定它是否适用于自动...查看更新。
    • 在教程和文档更新中没有足够的信息。我需要处理默认错误以及自定义 404 或 405 页面的自定义错误。为此,我在我的系统目录中添加了 error404.php 并处理我在新控制器系统控制器中使用的配置文件内部的默认错误。但在某种程度上它没有按我想要的方式工作
    【解决方案3】:

    你不能用 .htaccess 做到这一点吗?我个人创建了一个“错误”文件夹,其中包含所有包含错误消息的 html php 文件,并修改 .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 page not found错误时,将调用404.html页面。

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

    ErrorDocument 500     /500error.html
    

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

    【讨论】:

    • 我知道如何使用 htaccess 来做到这一点,但我正在学习 YII,我的系统要求我必须通过 yii 使用它。如果你有任何想法如何使用 yii 来做到这一点,因为即使它的教程也非常模糊,根本没有提供更广泛的视野。帮帮我...
    【解决方案4】:

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

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

    因为 error 是一个数组。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-04-25
      • 2013-09-16
      • 2015-03-18
      • 1970-01-01
      • 2021-11-18
      • 2019-11-28
      • 2015-08-12
      • 2011-07-25
      相关资源
      最近更新 更多