2011-12-07 14 views
16

io abbiamo lavorato con CodeIgniter per un bel po 'di tempo e sto attualmente facendo un progetto per un cliente che vorrebbe una consuetudine pagina . Tutto va bene e il 404_override funziona alla grande.CodeIgniter 2.1 problema con show_404() e 404_override

Il mio problema arriva quando un visitatore sta cercando di accedere a un articolo che non esistono vorrei richiamare la funzione show_404(), ma questo mi mostra la pagina "out of box" 404 e non quello scritto nel 404_override.

Ho visto alcune correzioni per le versioni precedenti, ma non riesco a farlo funzionare in 2.1. Quindi se qualcuno mi può aiutare da questo sarei davvero grato.

risposta

20

Il reindirizzamento è più pulito; caricare una vista potrebbe funzionare anche.

Il problema qui è che show_404() viene in genere chiamato DOPO che il controller è già stato caricato (qualcosa doveva dire che mostra il 404 dopo tutto). A CI non piace caricare un secondo controller in quel punto, che è l'ostacolo principale.

L'opzione migliore probabilmente sta estendendo la funzione show_404() nella classe Exceptions per reindirizzare alla route 404. Senza un reindirizzamento, sarai bloccato a mostrare una vista o qualcosa che tu sai abbia tutti i "dati extra" di cui ha bisogno prima di chiamare il 404 (o suppongo che potresti caricarlo anche nella classe Exceptions). Può diventare davvero complicato in alcune viste dinamiche.

Ovviamente si desidera qualcosa di più avanzato rispetto alla semplice modifica del modello 404 nella cartella degli errori. Ho avuto problemi nel tentativo di accedere a get_instance() da quel file, poiché a volte è caricato prima che il controller sia costruito. Quindi, fate attenzione se si tenta che;)

Aggiornamento: Ecco un esempio di lavoro di estendere la funzione show_404() per caricare una vista

<?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

Grazie per la vostra risposta. prima di tutto ho sentito dire che un reindirizzamento sarebbe una cattiva idea, dal momento che non mostrerebbe il 404 sulla pagina corretta (invece tutti gli 404 sarebbero mostrati come accadendo nell'esempio.it/404) che dovrebbe essere una cattiva idea. Mentre scrivi, quello che voglio veramente è poter caricare viste all'interno dell'errore 404 per includere la mia navigazione, intestazione e piè di pagina. La modifica SO del modello 404 sarebbe un'opzione, se potessi usare le viste. Ho provato get_instance senza fortuna, ho trovato un post su questo blog ma non mi ha aiutato (era del 2008). –

+0

Grazie mille. Con quel piccolo frammento di codice mi ha aiutato molto. Ho persino provato a caricare il controller che ho creato per mostrare il mio 404, ma sembra che $ CI-> load-> non supporti i controller. (Quello che sto usando per 404_override). Ma questo ha reso la mia giornata :) –

+0

Forse refactoring il tuo controller 404_override per chiamare semplicemente show_404(), e avere la funzione show_404() caricare tutti i dati necessari. Keep it DRY man ...;) – landons

-1

ero alla ricerca per la stessa cosa, ma ha trovato soluzioni piuttosto lunghe come la creazione di un proprio error controller e di una classe di eccezioni o semplicemente il reindirizzamento alla pagina 404 (che non è buona semanticamente).

Così ho fatto un po 'di ricerche su come CI chiama internamente la rotta "404_override". Ecco la soluzione mi è venuta:

// 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! 

aggiungere questa funzione in sistema/file core/CodeIgniter.php. Questo sostituirà la funzione show_404. Puoi chiamarlo dai tuoi controller e chiamerà l'itinerario "404_override" indicato nel file routes.php.

+1

No core hack per favore :) – 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

Il mio approccio veloce per risolvere il problema è quello di creare una funzione in un file helper caricate automaticamente nel progetto su cui sto lavorando. Questo helper si limita a reindirizzare alla pagina 404 personalizzata. Così mi basta chiamare show_my_404() invece di show_404()

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