2012-08-05 71 views
11

我想显示404错误页面,因为我在我的protected/view/system文件夹中创建了error404.php文件。YII如何处理自定义404错误页面以及其他错误页面

默认情况下,我有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的错误函数处理的方式。但我找不到办法做到这一点。如果假设我删除“errorAction” =>“网站/错误”,从配置主则它通过调用

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

但这样做,我只能看到页面而不布局还包括其他的自定义错误显示404错误与404相同,但它们不相同。我多次阅读手册,但仍无法解决它。

回答

9

使用此代码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

,也可以定义在配置错误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属性没有设置值,则会显示来自系统文件夹的错误视图。因此,不需要将系统视图文件夹和控制器视图文件夹中的错误视图混合在一起。

+0

我不得不改变它到这个'if($ error = Yii :: app() - > errorHandler->错误['code'])''error-> code' was给我错误。 'getViewFile'也给我这个错误。 'CWebApplication及其行为没有名为“getViewFile”的方法或闭包。 (/Applications/XAMPP/xamppfiles/htdocs/wm/common/lib/yii/framework/base/CComponent.php:266)'有什么想法? – user2636556 2014-03-27 06:28:25

+0

'error-> code'的错误信息是'注意:试图在48行上的/Applications/XAMPP/xamppfiles/htdocs/wm/backend/controllers/SiteController.php中获取非对象的属性@Boris – user2636556 2014-03-27 07:06:13

+0

You是对的。应用程序类中没有getViewFile方法。应该调用控制器的方法:$ this-> getViewFile(...) – 2014-03-31 22:06:00

3

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

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

您的意思是提供if then else条件内部错误视图,然后相应地添加部分视图? (我认为它应该是一个自动的,如果我在系统目录中使用error404.php。 – wolvorinePk 2012-08-05 10:18:45

+0

是的..我不知道它与自动工作...看到的更新。 – bingjie2680 2012-08-05 10:31:15

+0

在教程和文档更新它有关于它的信息还不够多我需要处理默认错误以及自定义404或405页面的自定义错误为此,我在系统目录中添加了error404.php并处理默认错误,我在配置文件中使用新的控制器系统控制器,但有点它不工作我想要的方式 – wolvorinePk 2012-08-05 10:39:41

1

难道你不能用.htaccess来做这个吗?就我个人而言,我创建了一个包含所有包含错误消息的html php文件的“errors”文件夹,并修改.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文件在同一目录下存在:

与其他错误代码相同的作品。

+0

我知道要做到这一点使用htaccess,但我正在学习YII,我的系统要求我必须通过YII使用它。那么使用yii,因为即使它的教程是非常模糊,并没有给予更广泛的看法。帮助我们... – wolvorinePk 2012-08-05 10:36:33

1

在框架(我与1.14的工作)的最新版本使用:

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

因为错误是一个数组。