2011-10-04 26 views
5

Estoy usando la biblioteca de plantillas para CodeIgniter, http://williamsconcepts.com/ci/codeigniter/libraries/template/reference.html, y ahora también quiero implementar páginas de error personalizadas. Encontré un método que implica un MY_Router que extiende el enrutador predeterminado: http://maestric.com/doc/php/codeigniter_404 pero que solo trata los errores 404. Quiero que todos los errores muestren una página fácil de usar, incluidos errores de base de datos, etc., y quiero que pase por un controlador, en parte para que pueda usar la biblioteca de plantillas, y en parte también puedo implementar una función de correo electrónico para enviarme información sobre el error que ocurrió.Páginas de error personalizadas con plantillas en CodeIgniter

Alguien preguntó acerca de la extensión de la funcionalidad del método MY_Router anterior para otros errores, como error_db, pero no obtuvo respuesta del autor, por lo que estoy volviendo aquí para ver si alguien sabe cómo hacerlo, en la línea de el método anterior o cualquier otra forma simple de lograrlo. Tenga en cuenta que soy un novato, así que no asuma demasiado sobre mi conocimiento de la funcionalidad básica CodeIgniter :-)

+0

reloj en el que '/ aplicación lication/errors/error_ * 'archivos, hay plantillas db error, 404, php error y errores generales, por lo que puede trabajar con él – user973254

+2

y puede ampliar clases centrales de CI (exactamente lo que necesita para extender CI_Exceptions) como se explica [aquí] (http://codeigniter.com/user_guide/general/core_classes.html) – user973254

+0

Conozco los archivos de error, pero no sé cómo hacer que usen la biblioteca de plantillas para que se vean como el resto del sitio. ¿Cómo ampliaría las clases centrales de CI para lograr esto? Proporcione una respuesta con ejemplos ... – Anders

Respuesta

1

Lo hago así: Creo mi propia página de error, y cada vez que debería lanzar un 404 error, actualmente cargo mi página 404.

lo tanto, decir que mi controlador por defecto es site.php, mi site.php se ve así:

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

Así que sirven a la casa/404.php cada vez que se produce un error. es decir, no permito que CodeIgniter llame al show_404();, por lo tanto, la página 404 se parece a cualquier otra página.

p.s. Supongo que siguió el buen tutorial en el sitio web de CodeIgniter.

+5

Como quiera, todavía enviará el código HTTP 200. Simplemente da la ilusión de tener 404. – Jeremy

2

He creado una extensión para la clase Excepciones. En esta extensión he reemplazado el método $this->Exceptions->show_error();, que es utilizado por la función show_error() de CI.

cuando llamo a show_error('User is not logged in', 401); este método personalizado está buscando primero un archivo error_$status_code. En el caso del ejemplo anterior, buscará un archivo error_401.php.

Cuando este archivo no existe, simplemente cargará el archivo error_general.php, como lo hace el archivo predeterminado $this->Exceptions->show_error();.

En su caso, puede usar el siguiente código para usar en su biblioteca, controlador o lo que sea que arroje un error.

<?php 
 

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

 
?>

Su archivo error_401.php debe ser de la siguiente manera:

<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

La forma más sencilla para crear páginas de error personalizadas es editar los archivos a la /application/views/errors/html/error_*.php como error_404.php (para 404), error_db.php (por errores de base de datos) y error_general.php (para la mayoría de otros errores).

Como estas páginas están en su directorio application, puede personalizarlas según sus necesidades.

Si la plantilla de la vista normal ve algo como esto:

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

Puede adaptar esto en sus archivos /application/views/errors/html/error_*.php así:

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

en cuenta que ya no estamos utilizando puntos de vista, pero en su lugar, incluye los archivos de vista para header & footer.

Otra cosa a destacar:

En la vista header, estoy pasando un objeto $data que incluye $data['page_title']. Como las páginas de error no usan vistas, debe agregar las variables que normalmente pasaría a la vista, de ahí la presencia de $page_title.

0
config/routes.php 

edición

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

tipo aquí su controlador, por ejemplo, un error

crear un funcióníndice y carga su vista

Cuestiones relacionadas