2012-08-05 30 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'] 

因爲錯誤是一個數組。