2011-10-04 14 views
5

Sto utilizzando la libreria di modelli per CodeIgniter, http://williamsconcepts.com/ci/codeigniter/libraries/template/reference.html e ora voglio implementare anche le pagine di errore personalizzate. Ho trovato un metodo che coinvolge un MY_Router che estende il router predefinito: http://maestric.com/doc/php/codeigniter_404 ma che tratta solo gli errori 404. Voglio che tutti gli errori mostrino una semplice pagina user-friendly, inclusi errori del database, ecc., E voglio che passi attraverso un controller, in parte in modo da poter usare la libreria dei template, e in parte anche per implementare una funzione email per inviarmi informazioni sull'errore che si è verificato.Pagine di errore personalizzate con modelli in CodeIgniter

Qualcuno ha chiesto di estendere la funzionalità del metodo MY_Router sopra per altri errori, come error_db, ma non ha ricevuto risposta dall'autore, quindi sto girando qui per vedere se qualcuno sa come farlo, sulla falsariga di il metodo di cui sopra o qualsiasi altro modo semplice per raggiungerlo. Si prega di notare che sono un principiante, quindi non dare per scontato la mia conoscenza della funzionalità di CodeIgniter di base :-)

+0

orologio in voi '/ App lication/errors/error_ * 'file, ci sono db error template, 404, errore php e errori generali, quindi puoi lavorare con esso – user973254

+2

ed è possibile estendere le classi core CI (esattamente è necessario estendere CI_Exceptions) come spiegato [qui] (http://codeigniter.com/user_guide/general/core_classes.html) – user973254

+0

Conosco i file di errore, ma non so come farli usare la libreria dei modelli per farli sembrare come il resto del sito. Come potrei estendere le classi di nucleo della CI per raggiungere questo obiettivo? Si prega di fornire una risposta con esempi ... – Anders

risposta

1

Io faccio così: Creo la mia pagina di errore, e ogni volta che dovrei lanciare un 404 errore, in realtà carico la mia pagina 404.

così dicono il mio controller di default è site.php, il mio site.php assomiglia a questo:

<?php if (! defined('BASEPATH')) exit('No direct script access allowed'); 

class Site extends CI_Controller { 

    public function index() 
    { 
     $this->load->view('welcome_message'); 
    } 

    public function view($page = "home" , $function = "index") 
    { 
     do_something(); 
     if($status == "404") 
     { 
      $function = "404"; 
     } 
     $this->load->view('templates/header', $data); 
     $this->load->view($page.'/'.$function, $data);  
     $this->load->view('templates/footer', $data); 
    } 




} 

/* End of file welcome.php */ 
/* Location: ./application/controllers/welcome.php */ 

Così mi servono casa/404.php ogni volta che si verifica un errore. Ad esempio, non autorizzo CodeIgniter a chiamare show_404();, pertanto la pagina 404 ha l'aspetto di qualsiasi altra pagina.

p.s. Suppongo che tu abbia seguito il bel tutorial nel sito web di CodeIgniter.

+5

In questo modo si invia comunque il codice HTTP 200. Dà solo l'illusione di avere 404. – Jeremy

2

Ho creato un'estensione per la classe Exceptions. In questa estensione ho sostituito il metodo $this->Exceptions->show_error();, strega viene utilizzata dalla funzione show_error() di CI.

quando chiamo show_error('User is not logged in', 401); questo metodo personalizzato cerca dapprima un file error_ $status_code. Nel caso dell'esempio sopra, cercherà un file error_401.php.

Quando questo file non esiste, carica solo il file error_general.php, come fa il default $this->Exceptions->show_error();.

Nel tuo caso, è possibile utilizzare il seguente codice da utilizzare nella libreria, nel controller o in qualsiasi altro modo per generare un errore.

<?php 
 

 
if(!(isset($UserIsLoggedin))){ 
 
    $this->load->view('template/header'); 
 
    show_error('User is not logged in', 401); 
 
    $this->load->view('template/footer'); 
 
} 
 

 
?>

Il file dovrebbe error_401.php di simile a questa:

<div id="container"> 
 
\t <h1><?php echo 'This is an 401 error'; ?></h1> 
 
\t <?php echo $message; ?> 
 
</div>

/application/core/MY_Exceptions.php:

<?php if (! defined('BASEPATH')) exit('No direct script access allowed'); 
 

 
class MY_Exceptions extends CI_Exceptions 
 
{ 
 
\t 
 
\t function show_error($heading, $message, $template = 'error_general', $status_code = 500) 
 
\t { \t \t 
 
\t \t if((!isset($template)) || ($template == 'error_general')){ 
 
\t \t \t if(file_exists(APPPATH.'errors/error_'.$status_code.'.php')) { 
 
\t \t \t \t $template = 'error_'.$status_code; 
 
\t \t \t } 
 
\t \t }  \t 
 
\t \t 
 
\t \t if (!isset($status_code)) $status_code = 500; 
 
\t \t 
 
\t \t set_status_header($status_code); 
 

 
\t \t $message = '<p>'.implode('</p><p>', (! is_array($message)) ? array($message) : $message).'</p>'; 
 

 
\t \t if (ob_get_level() > $this->ob_level + 1) 
 
\t \t { 
 
\t \t \t ob_end_flush(); 
 
\t \t } 
 
\t \t ob_start(); \t \t 
 
\t \t \t \t 
 
\t \t include(APPPATH.'errors/'.$template.'.php'); 
 
\t \t $buffer = ob_get_contents(); 
 
\t \t ob_end_clean(); 
 
\t \t return $buffer; 
 
\t } 
 
\t 
 
} 
 

 
?>

1

Il modo più semplice per creare pagine di errore personalizzate è quello di modificare i file in /application/views/errors/html/error_*.php come error_404.php (per 404s), error_db.php (per gli errori di database) e error_general.php (per la maggior parte altri errori).

Poiché queste pagine si trovano nella directory application, è possibile personalizzarle in base alle proprie esigenze.

Se il normale modello di vista simile a questa:

<?php $this->load->view('includes/header'); ?> 
... 
... 
<?php $this->load->view('includes/footer'); ?> 

È possibile adattare questo nei vostri file /application/views/errors/html/error_*.php in questo modo:

<?php 
    $page_title = $heading; 
    include VIEWPATH.'includes'.DIRECTORY_SEPARATOR.'header.php'; 
?> 
<div class="well"> 
    <h1><?php echo $heading; ?></h1> 
    <?php echo $message; ?> 
</div> 
<?php include VIEWPATH.'includes'.DIRECTORY_SEPARATOR.'footer.php'; ?> 

Si noti che non siamo più utilizzando le viste, ma includendo invece i file di visualizzazione per header & footer.

Un'altra cosa da notare:

Nella vista header, che sto passando un oggetto $data che comprende $data['page_title']. Poiché le pagine di errore non utilizzano le viste, devi aggiungere qualsiasi variabile che normalmente passeresti nella vista, quindi la presenza di $page_title.

0
config/routes.php 

modificare

$route['404_override'] = ''; 

tipo qui il controller per esempio errore

creare una funzioneindice e carico tua vista

Problemi correlati