Как проверить, является ли текущая страница ошибкой 404 из модуля / шаблона?

Ответы:

33

В Drupal 7 вы можете использовать drupal_get_http_header().

В файле template.php используйте этот код.

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

В Drupal 8 вы можете использовать следующий код в хуке.

$route_name = \Drupal::request()->attributes->get('_route');
if ('system.404' === $route_name) {
  // Do something.
}
fzmaster
источник
В какую функцию входит этот код, внутри template.php?
Джордан Магнусон
1
Вы можете разместить этот код внутри template_preprocess_page (& $ variable)
fzmaster
Это также может быть реализовано в hook_exit ()
sheldonkreger
Если вы хотите справиться с 403, вы можете использовать:if ($status == '403 Forbidden') { /* ... do stuff ... */ }
tyler.frankenstein
2
Примечание: решение для Drupal 8, основанное на system.404маршруте, не работает, если вы указали страницу узла в качестве своей страницы 404 в Конфигурация> Система> Основные настройки сайта . Смотрите @Gervase 'ответ для решения, которое работает, когда у вас есть или не указана пользовательская страница 404.
Джеймс Уилсон
11

Drupal 8.2.x:

К сожалению, drupal_get_http_header ("status") больше не работает.

Пытаться:

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

}

Здесь обсуждается это: https://www.drupal.org/node/1969270

Gervase
источник
1
Это именно то, что я искал! <3
Джеймс Уилсон
1
Осторожно, хотя - объект, перезапущенный там, может не иметь getStatusCodeфункции.
fritzmg
Это заканчивает мои бесконечные поиски и попытки.
usmanjutt84
4

Это самый простой способ обнаружить отказ в доступе (403) и страницу не найдена (404) в 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_itemне будет пустым, если для site_404переменной задан путь к узлу, поэтому потребуются дополнительные проверки.
gapple
menu_get_item, дороговато звонить на страницу нет?
Кевин