2009-05-11 12 views
5

CodeIgniter tiene /system/application/errors/error_404.php que se muestra cuando hay un 404 debido a lo que efectivamente es una condición de "controlador no encontrado". Sin embargo, para mi proyecto, realmente necesito que este error se maneje de la misma manera que cuando falta un método en la clase del controlador. En ese caso, muestro una vista normal con una linda página "Página no encontrada: ¿Quizás quiso decir esto? ..." completa con navegación generada por base de datos, etc.¿Cómo creo un controlador 404 de errores decente para CodeIgniter?

Pienso que podría hacer una de dos cosas :

  1. crear una llamada header("Location: /path/to/error_page") para redirigir al manejador
  2. una ya existente (o especiales) del controlador 404 Añadir una especie de router por defecto para manejarlo.

¿Cuál es la mejor manera de lograr el resultado deseado? ¿Hay algún escollo por el que tener cuidado?

Respuesta

2

Uso CodeIgniter con Smarty. Tengo una función adicional en mi clase Smarty llamada notfound(). Llamada no encontrada() establece la ubicación correcta del encabezado en una página 404 y luego muestra una plantilla 404. La plantilla tiene un título y un mensaje anulables, por lo que es muy versátil. He aquí algunos ejemplos de código:

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; 
} 

En un controlador que pueda hacer algo como esto:

$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(); 
} 

Del mismo modo, puedo cambiar el código en /system/application/error/error_404.php a:

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

Funciona muy bien, utiliza una pequeña cantidad de código y no duplica la funcionalidad 404 para diferentes tipos de entidades faltantes.

Creo que podría hacer algo similar con las vistas incorporadas de CodeIgniter. Lo importante es escupir el encabezado antes de hacer tus cosas de vista.

Actualización: Yo uso una costumbre Smarty envoltorio similar a la descrita aquí:

Using Smarty with CodeIgniter

Cuestiones relacionadas