¿Cómo verificar si la página actual es un error 404 de un módulo / plantilla?

Respuestas:

33

En Drupal 7, puedes usar drupal_get_http_header().

En el archivo template.php, use este código.

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

En Drupal 8, puede usar el siguiente código en un gancho.

$route_name = \Drupal::request()->attributes->get('_route');
if ('system.404' === $route_name) {
  // Do something.
}
fzmaster
fuente
¿En qué función entra este código, dentro de template.php?
Jordan Magnuson el
1
Puede colocar este código dentro de template_preprocess_page (& $ variables)
fzmaster
Esto también se puede implementar en hook_exit ()
sheldonkreger
Si está buscando manejar un 403, puede usar:if ($status == '403 Forbidden') { /* ... do stuff ... */ }
tyler.frankenstein
2
Nota: la solución para Drupal 8 basada en la system.404ruta no funciona si ha especificado una página de nodo como su página 404 en Configuración> Sistema> Configuración básica del sitio . Consulte la respuesta de @Gervase para obtener una solución que funciona cuando tiene o no tiene especificada una página 404 personalizada.
JamesWilson
11

Drupal 8.2.x:

Desafortunadamente, drupal_get_http_header ("estado") ya no funciona.

Tratar:

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

}

Aquí hay una discusión sobre esto: https://www.drupal.org/node/1969270

Gervase
fuente
1
¡Esto es justo lo que estaba buscando! <3
JamesWilson
1
Sin embargo, tenga cuidado: el objeto que se reajusta allí podría no tener una getStatusCodefunción.
fritzmg
Termina mi búsqueda e intento sin fin.
usmanjutt84
4

Esta es la forma más sencilla de detectar el acceso denegado (403) y la página no encontrada (404) en 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
fuente
$router_itemno estará vacío si la site_404variable se establece en una ruta de nodo, por lo que se necesitarían verificaciones adicionales.
gapple
menu_get_item, llamada costosa por página no?
Kevin