2016-03-04 69 views
1

我有一個控制器,我需要檢查url中的有效標識,如果ID不匹配,則返回show_404()CodeIgniter 3:show_404()只顯示模板文件,而不顯示控制器

當我面臨的問題是,當我打電話show_404()那隻能說明view/error/404.html,而不是定製my404控制器,我在routes.php

差異配置是my404控制器添加頁眉和頁腳相同view/error/404.html

+0

分享'router.php'你這讓代碼。 – Tpojka

+0

其簡單, '$ route ['default_controller'] ='home';' '$ route ['404_override'] ='my404';' '$ route ['translate_uri_dashes'] = FALSE;' – user3526

回答

6

爲了有一個調用show_404()時自定義404頁面,您需要擴展核心。

當你簡單地將它添加到路由中時,它不會影響show_404()。

在應用程序/文件夾的核心:

class MY_Exceptions extends CI_Exceptions { 

    /** 
    * 404 Error Handler 
    * 
    * @uses CI_Exceptions::show_error() 
    * 
    * @param string $page  Page URI 
    * @param bool $log_error Whether to log the error 
    * @return void 
    */ 
    public function show_404($page = '', $log_error = TRUE) 
    { 
     if (is_cli()) 
     { 
      // For CLI 
      $heading = 'Not Found'; 
      $message = 'The controller/method pair you requested was not found.'; 
      echo $this->show_error($heading, $message, 'error_404', 404); 
     } 
     else 
     { 
      // For view 
      $CI = &get_instance(); 
      $CI->layout->show('front/error/404', $CI->view_data); //Note I am using layout library. You'll probably use $CI->load->view() 
      echo $CI->output->get_output(); 
     } 

     // By default we log this, but allow a dev to skip it 
     if ($log_error) 
     { 
      log_message('error', $heading.': '.$page); 
     } 

     exit(4); // EXIT_UNKNOWN_FILE 
    } 

} 
+0

I confirm這工作正常,但建議添加$ CI-> output-> set_status_header('404');在$ CI =&get_instance()之後; –

+0

此代碼可以正常工作,但不適用於CLI,因爲您已更改CLI以及HTML的輸出。你應該做一個if - > else類型的語句並輸出兩種不同的方式。 –

+0

@BrianGottier我編輯了答案 –