Pages d'erreurs personnalisées

From Joomla! Documentation

This page is a translated version of the page Custom error pages and the translation is 100% complete.

Other languages:
Deutsch • ‎English • ‎español • ‎français • ‎Nederlands • ‎русский
Split-icon.png
Split Page into Specific Joomla! Versions - J2.5 and 3.x

It has been suggested that this article or section be split into specific version Namespaces. (Discuss). If version split is not obvious, please allow split request to remain for 1 week pending discussions. Proposed since 2 years ago.

Joomla! utilise le fichier templates/system/error.php afin de gérer plusieurs statuts d'erreurs HTTP y compris les erreurs "403 Forbidden", "404 not Found" et "500 Internal Server". Si vous le souhaitez, il est possible de définir le style du message d'erreur.

Il est important de comprendre que le fichier error.php est un fichier indépendant du CMS Joomla! mais dépendant du framework Joomla. Les plugins ne fonctionnent avec le fichier. Vous ne pouvez pas inclure des modules ou encore utiliser la déclaration <jdoc:include>.

Substitution des résultats d'erreurs système

Pour remplacer les résultats d'erreurs système, il convient de copier le fichier templates/system/error.php dans votre dossier templates/<nom du template>.

Si une erreur est trouvée, Joomla va utiliser le fichier error.php du template utilisé en lieu et place du fichier système.

Vous pouvez formater la page comme vous le souhaitez afin de correspondre à votre template.

Substitution des styles du système

Si vous souhaitez changer les styles, copiez le fichier templates/system/css/erreur.css dans votre dossier templates/<nom du template>/css. Ensuite, mettez à jour votre fichier templates/<nom du template>/error.php afin de référencer la feuille de style en changeant cette ligne en conséquence ː

<link rel="stylesheet" href="<?php echo $this->baseurl; ?>/templates/system/css/error.css" type="text/css" />

Ensuite, il suffit de modifier le fichier error.css comme vous le souhaité et en fonction de vos exigences de style.

Personnalisation des messages d'erreur

En fonction du code d'erreur spécifique, vous pouvez ajouter des logiques conditionnelles afin de varier les messages retournés.

Voici un exemple sur la façon d'intercepter une erreur 404 et de proposer un message personnalisé.

<?php  if ($this->error->getCode() == '404') { ?>
	<div id="errorboxheader">Page not found</div>
		<div id="errorboxbody"><p>Sorry! That page cannot be found.</p>
		</div>
	</div>
<?php } ?>

Code de statut HTTP

Lorsqu'une requête est faite pour une page de votre site, le serveur renvoie un code d'état HTTP en réponse à la demande. Joomla! retourne un '200 - le serveur va renvoyer une page spécifique pour les erreurs. Cette situation est problématique pour ceux qui travaillent avec les services Google Webmaster et tentent de résoudre les questions de sitemap.

Si vous voulez que Joomla! retourne un code de statut d'erreur, vous pouvez le faire en ajoutant la logique suivante avant la ligne du DOCTYPE :

<?php 
if ($this->error->getCode() == '404') {
	header("HTTP/1.0 404 Not Found");
} ?>

Plus d'informations sur les statuts HTTP

Utiliser les thèmes d'en-tête et de pied de page sur la page d'erreur standard

Joomla 1.5 Si vous souhaitez voir votre page d'erreur suivant le même style de votre template et ne voulez pas d'une redirection vers l'URL d'une page d'erreur ou dupliquer le HTML dans la page d'erreur de votre template, voici un processus permettant d'appliquer le style de votre template à la page d'erreur.

Tout d'abord, placez le code suivant dans templates/<nom du template>/error.php:

<?php
// no direct access
defined( '_JEXEC' ) or die( 'Restricted access' );

include dirname(__FILE__) . "/index.php";
?>

Ensuite, opérez les modifications suivantes dans templates/<nom du template>/index.php :

1. Trouver le code suivant dans index.php

<jdoc:include type="head" />

et remplacez le par le suivant ː

<?php if (!$this->error->getCode()) : ?>
<jdoc:include type="head" />
<?php else : ?> 
<title><?php echo $this->error->getCode() ?> - <?php echo $this->title; ?></title>
<?php endif; ?>

1. Trouver le code suivant dans le fichier index.php

<jdoc:include type="component" />

et remplacez le par le suivant ː

<?php if ($this->error->getCode()) : /* check if we are on error page, if yes - display error message */ ?>
  <p><strong><?php echo $this->error->getCode() ?> - <?php echo $this->error->message ?></strong></p>
  <p><strong><?php echo JText::_('JERROR_LAYOUT_NOT_ABLE_TO_VISIT'); ?></strong></p>
  <ol>
    <li><?php echo JText::_('JERROR_LAYOUT_AN_OUT_OF_DATE_BOOKMARK_FAVOURITE'); ?></li>
    <li><?php echo JText::_('JERROR_LAYOUT_SEARCH_ENGINE_OUT_OF_DATE_LISTING'); ?></li>
    <li><?php echo JText::_('JERROR_LAYOUT_MIS_TYPED_ADDRESS'); ?></li>
    <li><?php echo JText::_('JERROR_LAYOUT_YOU_HAVE_NO_ACCESS_TO_THIS_PAGE'); ?></li>
    <li><?php echo JText::_('JERROR_LAYOUT_REQUESTED_RESOURCE_WAS_NOT_FOUND'); ?></li>
    <li><?php echo JText::_('JERROR_LAYOUT_ERROR_HAS_OCCURRED_WHILE_PROCESSING_YOUR_REQUEST'); ?></li>
  </ol>
  <p><strong><?php echo JText::_('JERROR_LAYOUT_PLEASE_TRY_ONE_OF_THE_FOLLOWING_PAGES'); ?></strong></p>

  <ul>
  <li><a href="<?php echo $this->baseurl; ?>/index.php" title="<?php echo JText::_('JERROR_LAYOUT_GO_TO_THE_HOME_PAGE'); ?>"><?php echo JText::_('JERROR_LAYOUT_HOME_PAGE'); ?></a></li>
  </ul>

  <p><?php echo JText::_('JERROR_LAYOUT_PLEASE_CONTACT_THE_SYSTEM_ADMINISTRATOR'); ?>.</p>
<?php else : ?>
  <jdoc:include type="component" />
<?php endif; ?>

Maintenant, votre template est également appliqué aux pages d'erreur.

Note : les modules intégrés dans le template ne fonctionneront pas sur une page d'erreur créée en suivant cette méthode, mais ils fonctionneront sur les autres pages.

L'utilisation de modules dans les pages d'erreur

Les modules ne peuvent pas être inclus dans les pages d'erreur de la même manière que dans l'index.php d'un template car vous ne pouvez pas utiliser les déclarations <jdoc:include>. Il existe une alternative grâce à l'utilisation de JModuleHelper.

Pour inclure un module unique par titre, vous pouvez utiliser :

if (JModuleHelper::getModule('menu')) { 
    echo $doc->getBuffer('module', 'menu');
}

Pour inclure plusieurs modules par position, vous pouvez utiliser :

$modules = JModuleHelper::getModules( 'footer_3' );
$attribs['style'] = 'xhtml';
foreach ($modules AS $module ) {
    echo JModuleHelper::renderModule( $module, $attribs );
}