Comment créer une page d'erreur 404 personnalisée avec CodeIgniter ?

Introduction

Les instructions de cette page ont été testées sur un serveur Cloud9 avec les versions suivantes :

Modifier le fichier error_404.php

il y a deux façon de créer une erreur 404 personnalisée avec CodeIgniter. La première est tout simplement d'écraser le fchier /application/views/errors/html/error_404.php. avec sa version personnalisée de la page.

Cette solution fonctionne, mais n'est pas idéale. Avec un framework comme CodeIgniter, nous utilisons généralement des templates d'en-tête (header) et de pied de page (footer). En modifiant directement le contenu du fichier précédent, nous ne pouvos pas utiliser nos templates. C'est un problème si l'on utilise des bibliothèques externes comme Bootstrap. Si l'on veut actualiser la version de la bibliothèque, nous devons el faire dans le template et dans notre page personnalisée error_404.php. A mon sens, la meilleur option est de créer une nouvelle route pour l'erreur 404.

Overriding error 404

CodeIgniter offre la possibilité de rediriger les erreur 404 vers un contrôleur personnalisé si la page demandée n'est pas trouvée. Dans le fichier /application/config/routes.php, ajoutez la route suivante :

$route['404_override'] = 'errors/error404';

Cette route doit être ajoutée à la fin car les routes sont analysée dans l'ordre. Les routes les plus importantes doivent être prioritaires sur les autres. En case d'erreur, la méthode error404() du contrôleur Errors va être appelé.

Contrôleur

Créez un nouveau contrôleur dans le fichier /application/controllers/Errors.php, copiez et personnalisez le code suivant :

<?php

// Error controller
// This controller is used to manage the errors (404)
class Errors extends CI_Controller 
{

    // Main controller for the contact form
    public function error404()
    {
        // Create your custom controller

        // Display page
        $this->load->view('templates/header');
        $this->load->view('errors/error404');
        $this->load->view('templates/footer');
    }
}

Vue

Créez une nouvelle vue dans /application/views/errors/error404.php. Dans ce fichier, créez votre page d'erreur personnalisée, par exemple :

<div class="text-center text-secondary">

    <h1 class="display-1 text-danger font-title font-weight-bold">404</h1>
    <h3 class="display-4 font-title">Page non trouvée</h3>

    <div>
        La page que vous tentez d'afficher n'existe pas ou une autre erreur s'est produite.
    </div>
    <div>
    Vous pouvez revenir à <a href="javascript:history.back()">la page précédente</a> ou aller à 
    <a href="/">la page d'accueil</a>.
    </div>

</div>

Page d'erreur personnalisée pour CodeIgniter

Notez que cet exemple utilise deux scripts externes : FontAwesome et Bootstrap.

La fonction show_404()

La création d'une nouvelle route ne fonctionne pas lorsque la fonction show_404() est appelée (dans un contrôleur par exemple). CodeIgniter étant open source, il est possible de modifier le code de la fonction qui se trouve dans le fichier /system/core/Common.php. Personnellement, j'évite au maximum de modifier le coeur des frameworks.

Je suggère plutôt une petite astuce, qui si elle n'est pas idéale est assez élégante et parfaitement fopnctionnelle. Au début du fichier /application/views/errors/html/error_404.php, ajoutez une redirection vers une page qui n'existe pas, par exemple /404_override/. Quand la fonction show_404() est appelée, votre page d'erreur personnalisée va être affichée :

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

// ADD THIS REDIRECTION
redirect ('/404_override');

?><!DOCTYPE html>
<html lang="en">
//...

La création d'une nouvelle route ne fonctionne pas lorsque la fonction show_404() est appelée (dans un contrôleur par exemple). Pour contrer ce problème, la meilleure option est de surcharger la fonction show_404(). Pour cela, il suffit de créer un fichier application/core/MY_Exceptions.php avec le code suivant :

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

class MY_Exceptions extends CI_Exceptions {

    function __construct() {
        parent::__construct();
    }

    // Overide the 404 error
    public function show_404($page = '', $log_error = TRUE)
    {
        // Since $this is not available, use $this->CI instead
        $this->CI =& get_instance();

        // Votre super code ici !
        // ...
    }
}

Voir aussi


Dernière mise à jour : 23/11/2021