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.
}
fzmaster
la source
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

Gervase
la source
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']);
Lindsay
la source
$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