2011-12-07 52 views
16

我一直在努力與相當長的一段時間,我目前正在做針對想自定義網頁客戶端的項目。一切都很好,404_override它很好。笨2.1問題與show_404()和404_override

我的問題是當訪問者試圖訪問一個不存在的文章我想要調用show_404()函數,但這顯示了我的404頁面,而不是404_override中寫入的頁面。

我已經看到一些舊版本的修復,但我不能讓它在2.1工作。所以如果有人能幫我解決這個問題,我會非常感激。

回答

20

重定向最乾淨;加載視圖也可以工作。

這裏的問題是,show_404()通常在你的控制器已經加載後被調用(有些事情必須告訴它顯示404後)。 CI不喜歡在當時加載第二個控制器,這是主要障礙。

您的最佳選擇可能是擴展Exceptions類中的show_404()函數以重定向到404路由。在沒有重定向的情況下,你會被困在顯示一個視圖或者在調用404之前知道它需要所有「額外數據」的東西(或者我猜你也可以在Exceptions類中加載它)。在某些動態視圖中它可能會變得非常複雜。

您顯然想要比在錯誤文件夾中編輯404模板更高級的東西。我試圖從該文件訪問get_instance()時遇到了問題,因爲有時會在構建控制器之前加載它。所以,要小心,如果你嘗試;)

更新:這裏的延長show_404()函數來加載一個視圖

<?php 
// application/core/MY_Exceptions.php 
class MY_Exceptions extends CI_Exceptions { 

    public function show_404() 
    { 
     $CI =& get_instance(); 
     $CI->load->view('my_notfound_view'); 
     echo $CI->output->get_output(); 
     exit; 
    } 
} 
+1

謝謝你的迴應。 首先我聽說重定向是一個壞主意,因爲它不會在正確的頁面上顯示404(相反,所有的404將顯示爲發生在示例上。COM/404)這應該是一個壞主意。 正如你所寫,我真正想要的是能夠在404錯誤中加載視圖以包含我的導航,頁眉和頁腳。所以編輯404模板將是一個選項,如果我可以使用視圖。我嘗試get_instance沒有任何運氣,發現一篇關於它的博文,但沒有幫助(從2008年開始)。 –

+0

非常感謝。這個小小的代碼片段幫了我很多。我甚至試圖加載我製作的控制器來顯示我的404,但它看起來像$ CI-> load->不支持控制器。 (我用於404_override的那個)。但這只是我的一天:) –

+0

也許重構你的404_override控制器,只需調用show_404(),並讓show_404()函數加載所有你需要的數據。保持它乾燥的人...;) – landons

-1

我正在尋找同樣的東西的工作示例,但發現很長的解決方案,比如創建自己的錯誤控制器和異常類,或者簡單地重定向到404頁面(這在語義上不好)。

因此,我研究了CI如何在內部調用'404_override'路線。這是我想出瞭解決方案:

// Override show_404 method 
function show_404(){ 
    // Load Router and Core classes. 
    $RTR =& load_class('Router', 'core'); 

    // Get class and method for 404 from routes.php 
    $x = explode('/', $RTR->routes['404_override']); 
    $class = $x[0]; 
    $method = (isset($x[1]) ? $x[1] : 'index'); 

    // Get current class and method for callback 
    $callback_class = $RTR->fetch_class(); 
    $callback_method = $RTR->fetch_method(); 
    // Can also log here, using callback class and method. 

    // Create object for callback 
    $CI = new $callback_class; 
    call_user_func_array(array(&$CI, $method), array_slice(array($class,$method), 2)); 
} // End! 

添加此功能系統/核心/ CodeIgniter.php文件。 這將覆蓋show_404函數。你可以從你的控制器調用它,它會調用routes.php文件中給出的'404_override'路由。

+1

請不要核心破解:) – anupam

0
function show_404($page = '', $log_error = TRUE) 
{ 
    if ($log_error) 
    { 
     log_message('error', '404 Page Not Found --> '.$page); 
    } 
    redirect(base_url().index_page().'/controller/error_page'); 
      //OR 
      //redirect('SOME URL'); 

    exit; 
} 
2

我快速的方法來解決這個問題是在我工作的項目自動裝載輔助文件來創建一個功能。該幫助器只是重定向到自定義404頁面。所以我只是打電話show_my_404()而不是show_404()

function show_my_404(){ 
    //Using 'location' not work well on some windows systems 
    redirect('controller/page404', 'location'); 
}