Bagaimana cara menguji apakah halaman saat ini adalah halaman admin?

9

Pada titik tertentu saya mulai menggunakan kode berikut untuk menguji apakah halaman saat ini adalah halaman admin:

  $route = \Drupal::routeMatch()->getRouteObject();

  $is_admin = \Drupal::service('router.admin_context')->isAdminRoute($route);

Tapi saya menemukan bahwa ini gagal pada halaman edit simpul di hook_entity_load ().

Bagaimana kita menguji jika kita berada di halaman admin di Drupal 8? Sesuatu seperti path_is_admin () di Drupal 7?

Saya menemukan bahwa jika saya menguji simpul yang sama mengedit jalur halaman dari luar hook_entity_load, menggunakan kode pada halaman ini ( https://api.drupal.org/api/drupal/includes%21path.inc/function/path_is_admin/7.x ) berhasil.

use Symfony\Component\HttpFoundation\Request;
use Symfony\Cmf\Component\Routing\RouteObjectInterface;

$path = '/node/75/edit';
$request = Request::create($path);

$route_match = \Drupal::service('router.no_access_checks')->matchRequest($request);
$route = $route_match[RouteObjectInterface::ROUTE_OBJECT];
$is_admin = \Drupal::service('router.admin_context')->isAdminRoute($route);

Tetapi jika saya mencoba menambahkan kode ini di hook_entity_load menggunakan jalur saat ini, saya mendapatkan loop yang fatal.

Saya pikir di mana saya terjebak sedang memuat rute saat ini di hook_entity_load.

oknate
sumber
1
Edit simpul bukan halaman admin.
ya.teck
1
Anda dapat menjadikannya jalur admin dengan mengaktifkan opsi "Gunakan tema administrasi saat mengedit atau membuat konten" di bawah "Penampilan". Itu membuat semua rute dengan opsi _node_operation_routediaktifkan juga mendapatkan opsi _admin_route. \Drupal::service('router.admin_context')->isAdminRoute()memeriksa bendera itu untuk rute saat ini secara default.
TwoD

Jawaban:

19

* Diperbarui *

Ketika saya pertama kali menjawab pertanyaan ini, pengeditan simpul dan pengeditan taksonomi tidak ditetapkan sebagai rute admin. Jadi saya menambahkan cek terpisah untuk itu. Pemeriksaan terpisah seperti itu tidak diperlukan lagi. Berikut ini sepertinya menutupinya dengan cukup baik:

if (\Drupal::service('router.admin_context')->isAdminRoute()) {
 // do stuff
}

Jika Anda ingin memeriksa rute selain rute saat ini, Anda dapat meneruskannya ke isAdminRoute ().

Catatan, cara di atas tidak akan berfungsi untuk halaman edit simpul atau halaman edit istilah taksonomi jika Anda menghapus centang "Gunakan tema administrasi saat mengedit atau membuat konten" pada halaman admin tema di / admin / penampilan. Maka Anda perlu cek terpisah.

* Jawaban Asli: *

Untuk menguji apakah suatu halaman adalah halaman admin, Anda dapat menggunakan proses dua langkah. Karena regex untuk edit simpul mungkin tidak menggunakan tema admin.

Pertama saya menggunakan metode isAdminRoute:

  $route = \Drupal::routeMatch()->getRouteObject();

  $is_admin = \Drupal::service('router.admin_context')->isAdminRoute($route);

Kemudian Anda dapat menggunakan pemeriksaan tambahan untuk jalur untuk melihat apakah itu adalah halaman edit simpul:

  $current_path = \Drupal::service('path.current')->getPath();
  if(preg_match('/node\/(\d+)\/edit/', $current_path, $matches)) {
    $is_admin = TRUE;
  }

Berikut ini adalah cara yang cukup rumit, tetapi cukup lengkap untuk menguji simpul dan istilah halaman edit taksonomi serta rute admin lainnya:

  $route = \Drupal::routeMatch()->getRouteObject();

  $is_admin = FALSE;
  if (!empty($route)) {
    $is_admin_route = \Drupal::service('router.admin_context')->isAdminRoute($route);
    $has_node_operation_option = $route->getOption('_node_operation_route');
    $is_admin = ($is_admin_route || $has_node_operation_option);
  }
  else {
    $current_path = \Drupal::service('path.current')->getPath();
    if(preg_match('/node\/(\d+)\/edit/', $current_path, $matches)) {
      $is_admin = TRUE;
    }
    elseif(preg_match('/taxonomy\/term\/(\d+)\/edit/', $current_path, $matches)) {
      $is_admin = TRUE;
    }
  }
oknate
sumber
2
Menggunakan RegEx seperti itu memang praktik yang buruk dan harus dihindari. Sampai solusi ditemukan, Anda harus memeriksa apakah nama rute adalah 'entitas.node.edit_form'
Eyal
masalahnya $ rute mengembalikan nol, kosong. Saya tidak perlu melakukan regex jika -> getRouteObject () mengembalikan rute.
oknate
Aneh. Sudahkah Anda mencoba\Drupal::routeMatch()->getRouteName()
Eyal
1
\Drupal::routeMatch()->getRouteName()memberi saya nol (Drupal 8.3.2)
Guillaume Bois
1
Pemeriksaan tambahan Anda tidak ada halaman admin seperti revisi node, hapus dan terjemahan.
Philipp Michael
9

Berikut ini sedikit lebih ringkas, dan juga menangkap halaman edit simpul ketika mereka dikonfigurasi untuk menggunakan tema admin. The isAdminRouteMetode menggunakan Route saat ini jika tidak di tentukan:

  /** @var \Drupal\Core\Routing\AdminContext $admin_context */
  $admin_context = \Drupal::service('router.admin_context');
  if (!$admin_context->isAdminRoute()) {
    // perform tasks.
  }
Shaun Dychko
sumber
"Mengambil halaman edit simpul ketika mereka dikonfigurasi untuk menggunakan tema admin" adalah kunci di sini. Alasan saya mengajukan pertanyaan, adalah karena saya kesulitan mengambil halaman non-admin-tema seperti halaman edit simpul ketika mereka tidak menggunakan tema admin.
oknate
Ah, itu masuk akal. Ya, ini lebih rumit ketika halaman edit simpul tidak ditetapkan sebagai halaman admin.
Shaun Dychko