¿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.
}

¿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


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']);

$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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.