Como verificar se a página atual é um erro 404 de um módulo / modelo?

Respostas:

33

No Drupal 7, você pode usar drupal_get_http_header().

No arquivo template.php, use este código.

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

No Drupal 8, você pode usar o seguinte código em um gancho.

$route_name = \Drupal::request()->attributes->get('_route');
if ('system.404' === $route_name) {
  // Do something.
}
fzmaster
fonte
Qual a função desse código, dentro do template.php?
perfil completo de Jordan Magnuson
11
Você pode colocar esse código dentro template_preprocess_page (& $ variáveis)
fzmaster
Isso também pode ser implementado em hook_exit ()
sheldonkreger
Se você deseja manipular um 403, pode usar:if ($status == '403 Forbidden') { /* ... do stuff ... */ }
tyler.frankenstein
2
Nota: a solução para o Drupal 8 com base na system.404rota não funcionará se você especificou uma página de nó como sua página 404 em Configuração> Sistema> Configurações básicas do site . Consulte a resposta do @Gervase para obter uma solução que funcione quando você possui ou não uma página 404 personalizada especificada.
JamesWilson
11

Drupal 8.2.x:

Infelizmente, drupal_get_http_header ("status") não funciona mais.

Experimentar:

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

}

Há uma discussão sobre isso aqui: https://www.drupal.org/node/1969270

Gervase
fonte
11
Era exatamente isso que eu estava procurando! <3
JamesWilson
11
Cuidado, porém - o objeto recuperado lá pode não ter uma getStatusCodefunção.
Fritzmg 22/0318
Termina minha busca e tentativa sem fim.
usmanjutt84 23/07
4

Essa é a maneira mais simples de detectar acesso negado (403) e página não encontrada (404) no 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
fonte
$router_itemnão ficará vazio se a site_404variável estiver definida como um caminho do nó, portanto, verificações adicionais serão necessárias.
gapple
menu_get_item, chamada pouco cara por página não?
Kevin