我想显示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']
因为错误是一个数组。