Wie überprüfe ich, ob die aktuelle Seite ein 404-Fehler in einem Modul / einer Vorlage ist?

Antworten:

33

In Drupal 7 können Sie verwenden drupal_get_http_header().

Verwenden Sie in der Datei template.php diesen Code.

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

In Drupal 8 können Sie den folgenden Code in einem Hook verwenden.

$route_name = \Drupal::request()->attributes->get('_route');
if ('system.404' === $route_name) {
  // Do something.
}
fzmaster
quelle
Welche Funktion hat dieser Code in der template.php?
Jordan Magnuson
1
Sie können diesen Code in template_preprocess_page (& $ variables)
fzmaster 26.11.12
Dies kann auch in hook_exit () implementiert werden
sheldonkreger
Wenn Sie mit einem 403 umgehen if ($status == '403 Forbidden') { /* ... do stuff ... */ }
möchten
2
Hinweis: Die auf der system.404Route basierende Lösung für Drupal 8 funktioniert nicht, wenn Sie unter Konfiguration> System> Grundlegende Websiteeinstellungen eine Knotenseite als 404-Seite angegeben haben . In der Antwort von @Gervase finden Sie eine Lösung, die funktioniert, wenn Sie eine benutzerdefinierte 404-Seite angegeben haben oder nicht.
James Wilson
11

Drupal 8.2.x:

Leider funktioniert drupal_get_http_header ("status") nicht mehr.

Versuchen:

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

}

Eine Diskussion darüber gibt es hier: https://www.drupal.org/node/1969270

Gervase
quelle
1
Das ist genau das, wonach ich gesucht habe! <3
James Wilson
1
Vorsicht - das Objekt, das dort erneut ausgeführt wird, hat möglicherweise keine getStatusCodeFunktion.
Freitag
Es beendet meine endlose Suche und das Versuchen.
Usmanjutt84
4

Dies ist die einfachste Methode, um in Drupal 7 Zugriff verweigert (403) und Seite nicht gefunden (404) zu erkennen.

// 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
quelle
$router_itemwird nicht leer sein, wenn die site_404Variable auf einen Knotenpfad festgelegt ist, sodass zusätzliche Überprüfungen erforderlich wären.
Gapple
menu_get_item, etwas teurer Anruf pro Seite nein?
Kevin