Как проверить, является ли текущая страница ошибкой 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.
}

В какую функцию входит этот код, внутри 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


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, дороговато звонить на страницу нет?
Кевин
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.