Bagaimana cara memeriksa apakah halaman saat ini adalah kesalahan 404 dari modul / template?


Jawaban:


33

Di Drupal 7, Anda bisa menggunakan drupal_get_http_header().

Dalam file template.php, gunakan kode ini.

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

Di Drupal 8, Anda dapat menggunakan kode berikut dalam sebuah kail.

$route_name = \Drupal::request()->attributes->get('_route');
if ('system.404' === $route_name) {
  // Do something.
}

Apa fungsi dari kode ini, di dalam template.php?
Jordan Magnuson

1
Anda dapat menempatkan kode ini di dalam template_preprocess_page (& $ variabel)
fzmaster

Ini juga dapat diimplementasikan di hook_exit ()
sheldonkreger

Jika Anda ingin menangani 403, Anda dapat menggunakan:if ($status == '403 Forbidden') { /* ... do stuff ... */ }
tyler.frankenstein

2
Catatan: solusi untuk Drupal 8 berdasarkan system.404rute tidak berfungsi jika Anda telah menentukan halaman simpul sebagai halaman 404 Anda di Konfigurasi> Sistem> Pengaturan situs dasar . Lihat jawaban @Gervase untuk solusi yang berfungsi saat Anda memiliki atau tidak memiliki halaman 404 khusus yang ditentukan.
JamesWilson

11

Drupal 8.2.x:

Sayangnya, drupal_get_http_header ("status") tidak berfungsi lagi.

Mencoba:

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

}

Ada diskusi tentang ini di sini: https://www.drupal.org/node/1969270


1
Inilah yang saya cari! <3
JamesWilson

1
Berhati-hatilah - objek yang dipasang kembali di sana mungkin tidak memiliki getStatusCodefungsi.
fritzmg

Itu mengakhiri pencarian tak berujung saya dan mencoba.
usmanjutt84

4

Ini adalah cara paling sederhana untuk mendeteksi Access Denied (403) dan Page Not Found (404) di 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_itemtidak akan kosong jika site_404variabel diatur ke jalur simpul, jadi pemeriksaan tambahan akan diperlukan.
gapple

menu_get_item, panggilan agak mahal per halaman, bukan?
Kevin
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.