Comment vérifier si la page actuelle est une erreur 404 d'un module / modèle?


Réponses:


33

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

Dans quelle fonction ce code entre-t-il dans template.php?
Jordan Magnuson

1
Vous pouvez placer ce code dans template_preprocess_page (& $ variables)
fzmaster

Cela peut également être implémenté dans hook_exit ()
sheldonkreger

Si vous cherchez à manipuler une 403, vous pouvez utiliser:if ($status == '403 Forbidden') { /* ... do stuff ... */ }
tyler.frankenstein

2
Remarque: la solution pour Drupal 8 basée sur l' system.404itiné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.
JamesWilson

11

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


1
C'est exactement ce que je cherchais! <3
JamesWilson

1
Attention cependant - l'objet reculé là peut ne pas avoir de getStatusCodefonction.
fritzmg

Cela met fin à mes recherches et mes essais sans fin.
usmanjutt84

4

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_itemne sera pas vide si la site_404variable est définie sur un chemin de nœud, donc des vérifications supplémentaires seraient nécessaires.
gapple

menu_get_item, appel peu coûteux par page non?
Kevin
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.