Come verificare se la pagina corrente è un errore 404 da un modulo / modello?


Risposte:


33

In Drupal 7, puoi usare drupal_get_http_header().

Nel file template.php, usa questo codice.

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

In Drupal 8, puoi usare il seguente codice in un hook.

$route_name = \Drupal::request()->attributes->get('_route');
if ('system.404' === $route_name) {
  // Do something.
}

In quale funzione viene inserito questo codice, all'interno di template.php?
Jordan Magnuson,

1
Puoi inserire questo codice all'interno di template_preprocess_page (& $ variabili)
fzmaster,

Questo può essere implementato anche in hook_exit ()
sheldonkreger il

Se stai cercando di gestire un 403, puoi usare:if ($status == '403 Forbidden') { /* ... do stuff ... */ }
tyler.frankenstein il

2
Nota: la soluzione per Drupal 8 basata sul system.404percorso non funziona se è stata specificata una pagina nodo come pagina 404 in Configurazione> Sistema> Impostazioni sito di base . Vedi la risposta di @Gervase per una soluzione che funziona quando hai o non hai specificato una pagina 404 personalizzata.
JamesWilson

11

Drupal 8.2.x:

Sfortunatamente, drupal_get_http_header ("status") non funziona più.

Provare:

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

}

C'è una discussione qui: https://www.drupal.org/node/1969270


1
Questo è proprio quello che stavo cercando! <3
JamesWilson

1
Attenzione però: l'oggetto che vi è stato ricalcolato potrebbe non avere una getStatusCodefunzione.
fritzmg

Termina la mia ricerca e tentazione senza fine.
usmanjutt84,

4

Questo è il modo più semplice per rilevare Accesso negato (403) e Pagina non trovata (404) in 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_itemnon sarà vuoto se la site_404variabile è impostata su un percorso del nodo, quindi sarebbero necessari ulteriori controlli.
gapple

menu_get_item, chiamata poco costosa per pagina no?
Kevin,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.