Jak sprawdzić, czy bieżąca strona zawiera błąd 404 z modułu / szablonu?

Odpowiedzi:

33

W Drupal 7 możesz używać drupal_get_http_header().

W pliku template.php użyj tego kodu.

$status = drupal_get_http_header("status");
if ($status === '404 Not Found'){
  // Do something.
}

W Drupal 8 możesz użyć następującego kodu w haku.

$route_name = \Drupal::request()->attributes->get('_route');
if ('system.404' === $route_name) {
  // Do something.
}
fzmaster
źródło
Jaką funkcję ma ten kod w pliku template.php?
Jordan Magnuson,
1
Możesz umieścić ten template_preprocess_page kod wewnętrzny (& $ zmienne)
fzmaster
Można to również zaimplementować w hook_exit ()
sheldonkreger
Jeśli chcesz obsłużyć 403, możesz użyć:if ($status == '403 Forbidden') { /* ... do stuff ... */ }
tyler.frankenstein
2
Uwaga: rozwiązanie dla Drupala 8 oparte na system.404trasie nie działa, jeśli jako stronę 404 określono stronę węzła w Konfiguracja> System> Podstawowe ustawienia witryny . Zobacz odpowiedź @Gervase ', aby znaleźć rozwiązanie, które działa, gdy masz lub nie masz zdefiniowanej niestandardowej strony 404.
JamesWilson,
11

Drupal 8.2.x:

Niestety, drupal_get_http_header („status”) już nie działa.

Próbować:

$status = \Drupal::requestStack()->getCurrentRequest()->attributes->get('exception');
if ($status && $status->getStatusCode() == 404){

}

Dyskusja na ten temat tutaj: https://www.drupal.org/node/1969270

Gervase
źródło
1
To jest właśnie to, czego szukasz! <3
JamesWilson,
1
Ostrożnie - zrestartowany tam obiekt może nie mieć żadnej getStatusCodefunkcji.
fritzmg
To kończy moje niekończące się poszukiwania i próby.
usmanjutt84
4

Jest to najprostszy sposób na wykrycie odmowy dostępu (403) i nie znaleziono strony (404) w 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
źródło
$router_itemnie będzie pusty, jeśli site_404zmienna jest ustawiona na ścieżkę do węzła, więc potrzebne będą dodatkowe kontrole.
luka
menu_get_item, nieco droższe połączenie na stronę nie?
Kevin