2011-12-07 11 views
16

que han estado trabajando con CodeIgniter durante bastante tiempo, y actualmente estoy haciendo un proyecto para un cliente que le gustaría una costumbre página 404 . Todo está bien y el 404_override funciona muy bien.CodeIgniter 2.1 problema con show_404() y 404_override

Mi problema viene cuando un usuario está intentando acceder a un artículo que no existen quisiera llamar a la función show_404(), pero esto me muestra la página "out of box" 404 y no el escrito en el 404_override.

He visto algunas correcciones para versiones anteriores, pero no puedo hacer que funcione en 2.1. Entonces, si alguien puede ayudarme con esto, estaría muy agradecido.

Respuesta

20

Redirigir es más limpio; cargar una vista también podría funcionar.

El problema aquí es que show_404() se suele llamar DESPUÉS de que su controlador ya se haya cargado (algo tenía que indicarle que mostrara el 404 después de todo). A CI no le gusta cargar un segundo controlador en ese punto, que es el obstáculo principal.

Su mejor opción probablemente sea extender la función show_404() en la clase de excepciones para redireccionar a su ruta 404. Sin una redirección, tendrá que mostrar una vista o algo que sepa que tiene todos los "datos adicionales" que necesita antes de llamar al 404 (o supongo que también podría cargarlo en la clase de Excepciones). Puede ser realmente complicado en algunas vistas dinámicas.

Obviamente, usted desea algo más avanzado que simplemente editar la plantilla 404 en la carpeta de errores. He tenido problemas al intentar acceder a get_instance() desde ese archivo, ya que a veces se carga antes de que se construya el controlador. Por lo tanto, tenga cuidado si se intenta que;)

Actualización: Aquí está un ejemplo de trabajo de extender la función show_404() para cargar 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

Gracias por su respuesta. En primer lugar, escuché que una redirección sería una mala idea, ya que no mostraría el 404 en la página correcta (en cambio, se mostraría que todos los 404 están sucediendo en el ejemplo).com/404) que debería ser una mala idea. Al escribir, lo que realmente quiero es poder cargar vistas dentro del error 404 para incluir mi navegación, encabezado y pie de página. ASÍ QUE editar la plantilla 404 sería una opción, si pudiera usar vistas. Probé get_instance sin suerte, encontré una publicación de blog pero no me ayudó (era de 2008). –

+0

Muchas gracias. Con ese pequeño fragmento de código me ayudó mucho. Incluso intenté cargar el controlador que hice para mostrar mi 404, pero parece que $ CI-> load-> no es compatible con los controladores. (El que estoy usando para 404_override). Pero esto acaba de hacer que mi día :) –

+0

Tal vez refactorice su controlador 404_override simplemente llame a show_404(), y haga que la función show_404() cargue todos los datos que necesita. Keep it DRY man ...;) – landons

-1

que estaba buscando lo mismo, pero se encontró soluciones bastante largas como la creación de un propio controlador de errores y una clase de excepción o simplemente redirigir a la página 404 (lo cual no es bueno semánticamente).

Así que hice un poco de investigación sobre cómo CI llama a la ruta '404_override' internamente. Aquí está la solución que se me ocurrió:

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

Agregar esta función en el sistema de // archivo del núcleo CodeIgniter.php. Esto anulará la función show_404. Puede llamarlo desde sus controladores y llamará a la ruta '404_override' en el archivo routes.php.

+1

No hackear núcleo por favor :) – 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

Mi acercamiento rápido a la solución del problema es la creación de una función en un archivo de ayuda autocargado en el proyecto que estoy trabajando. Este asistente solo redirige a la página 404 personalizada. Así que acabo de llamar show_my_404() en lugar de show_404()

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