Comment vérifier, en D7, si la page en cours renvoie une erreur 404 à partir d'un module / modèle?
Comment vérifier, en D7, si la page en cours renvoie une erreur 404 à partir d'un module / modèle?
Réponses:
Dans Drupal 7, vous pouvez utiliser drupal_get_http_header()
.
Dans le fichier template.php, utilisez ce code.
$status = drupal_get_http_header("status");
if ($status === '404 Not Found'){
// Do something.
}
Dans Drupal 8, vous pouvez utiliser le code suivant dans un hook.
$route_name = \Drupal::request()->attributes->get('_route');
if ('system.404' === $route_name) {
// Do something.
}
if ($status == '403 Forbidden') { /* ... do stuff ... */ }
system.404
itinéraire ne fonctionne pas si vous avez spécifié une page de noeud comme page 404 dans Configuration> Système> Paramètres de site de base . Voir la réponse de @Gervase pour une solution qui fonctionne lorsque vous avez ou non une page 404 personnalisée spécifiée.
Drupal 8.2.x:
Malheureusement, drupal_get_http_header ("status") ne fonctionne plus.
Essayer:
$status = \Drupal::requestStack()->getCurrentRequest()->attributes->get('exception');
if ($status && $status->getStatusCode() == 404){
}
Il y a une discussion à ce sujet ici: https://www.drupal.org/node/1969270
getStatusCode
fonction.
C'est le moyen le plus simple de détecter l'accès refusé (403) et la page non trouvée (404) dans Drupal 7.
// get the menu router item for the current page
$router_item = menu_get_item();
// if there is no router item, this page is not found
$is_page_not_found_404 = empty($router_item);
// if 'access' is empty for the router item, access is denied
$is_access_denied_403 = empty($router_item['access']);
$router_item
ne sera pas vide si la site_404
variable est définie sur un chemin de nœud, donc des vérifications supplémentaires seraient nécessaires.