2009-05-11 10 views
5

CodeIgniter ha /system/application/errors/error_404.php che viene visualizzato quando c'è un 404 a causa di ciò che è effettivamente una condizione di "controller non trovato". Tuttavia, per il mio progetto, ho davvero bisogno che questo errore venga gestito esattamente come quando manca un metodo dalla classe controller. In tal caso, mostro una vista normale con una bella pagina "Pagina non trovata: Forse intendevi questo? ..." completa di navigazione generata dal database ecc.Come posso creare un errore decente 404 gestore per CodeIgniter?

I miei pensieri sono che potrei fare una delle due cose :

  1. creare una chiamata header("Location: /path/to/error_page") per reindirizzare a 404 handler una esistente (o speciale) del controller
  2. Aggiungere una sorta di router predefinito per gestire la cosa.

Qual è il modo migliore per ottenere il risultato richiesto? Ci sono delle insidie ​​a cui prestare attenzione?

risposta

2

Uso CodeIgniter con Smarty. Ho una funzione aggiuntiva nella mia classe Smarty chiamata notfound(). Chiamando notfound() imposta la posizione dell'intestazione corretta su una pagina 404 e quindi visualizza un modello 404. Il modello ha un titolo e un messaggio sovrascrivibili, quindi è molto versatile. Ecco alcuni esempi di codice:

Smarty.class.php 

function not_found() { 
header('HTTP/1.1 404 Not Found'); 

if (!$this->get_template_vars('page_title')) { 
    $this->assign('page_title', 'Page not found'); 
    } 

    $this->display('not-found.tpl'); 
    exit; 
} 

In un controller che posso fare qualcosa di simile:

$this->load->model('article_model'); 
$article = $this->article_model->get_latest(); 

if ($article) { 
    $this->smarty->assign('article', $article); 
    $this->smarty->view('article'); 
} else { 
    $this->smarty->assign('title', Article not found'); 
    $this->smarty->not_found(); 
} 

Allo stesso modo, posso cambiare il codice in /system/application/error/error_404.php a:

$CI =& get_instance(); 
$CI->cismarty->not_found(); 

Funziona perfettamente, utilizza una piccola quantità di codice e non duplica la funzionalità 404 per diversi tipi di entità mancanti.

Penso che si potrebbe fare una cosa simile con le visualizzazioni CodeIgniter incorporate. L'importante è sputare l'intestazione prima di fare le cose di vista.

Aggiornamento: Io uso uno Smarty wrapper personalizzato simile a quello descritto qui:

Using Smarty with CodeIgniter

Problemi correlati