Làm thế nào để kiểm tra nếu trang hiện tại là một trang quản trị?


9

Tại một số điểm, tôi bắt đầu sử dụng mã sau đây để kiểm tra xem trang hiện tại có phải là trang quản trị hay không:

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

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

Nhưng tôi thấy rằng điều này không thành công trên các trang chỉnh sửa nút trong hook_entity_load ().

Làm cách nào để kiểm tra nếu chúng tôi ở trên trang quản trị trong Drupal 8? Một cái gì đó giống như path_is_admin () trong Drupal 7?

Tôi thấy rằng nếu tôi kiểm tra cùng một đường dẫn trang chỉnh sửa nút từ bên ngoài hook_entity_load, sử dụng mã trên trang này ( https://api.drupal.org/api/drupal/includes%21path.inc/feft/path_is_admin/7.x ) nó hoạt động.

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);

Nhưng nếu tôi cố gắng thêm mã này vào hook_entity_load bằng đường dẫn hiện tại, tôi sẽ nhận được một vòng lặp nghiêm trọng.

Tôi nghĩ nơi tôi bị kẹt đang tải tuyến đường hiện tại trong hook_entity_load.


1
Chỉnh sửa nút không phải là một trang quản trị.
ya.teck

1
Bạn có thể đặt đường dẫn quản trị viên bằng cách chuyển đổi tùy chọn "Sử dụng chủ đề quản trị khi chỉnh sửa hoặc tạo nội dung" trong "Giao diện". Điều đó làm cho tất cả các tuyến đường với tùy chọn _node_operation_routeđược kích hoạt cũng có được tùy chọn _admin_route. \Drupal::service('router.admin_context')->isAdminRoute()kiểm tra cờ đó cho tuyến hiện tại theo mặc định.
TwoD

Câu trả lời:


19

* Cập nhật *

Khi tôi lần đầu tiên trả lời câu hỏi này, các trang chỉnh sửa nút và phân loại phân loại không được đặt làm tuyến quản trị. Vì vậy, tôi đã thêm kiểm tra riêng cho những người. Kiểm tra riêng biệt như vậy không cần thiết nữa. Sau đây dường như bao gồm nó khá tốt:

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

Nếu bạn muốn kiểm tra một tuyến đường khác với tuyến đường hiện tại, bạn có thể chuyển nó vào isAdminRoute ().

Lưu ý, cách trên sẽ không hoạt động đối với các trang chỉnh sửa nút hoặc trang chỉnh sửa thuật ngữ phân loại nếu bạn bỏ chọn "Sử dụng chủ đề quản trị khi chỉnh sửa hoặc tạo nội dung" trên trang quản trị chủ đề tại / admin / xuất hiện. Sau đó, bạn cần kiểm tra riêng.

* Trả lời gốc: *

Để kiểm tra xem một trang có phải là trang quản trị hay không, bạn có thể sử dụng quy trình hai bước. Vì regex cho chỉnh sửa nút có thể không được sử dụng chủ đề quản trị viên.

Đầu tiên tôi sử dụng phương thức isAdminRoute:

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

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

Sau đó, bạn có thể sử dụng một kiểm tra bổ sung cho đường dẫn để xem đó có phải là trang chỉnh sửa nút không:

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

Đây là một cách khá công phu, nhưng khá đầy đủ để kiểm tra các trang chỉnh sửa thuật ngữ phân loại và nút cũng như các tuyến quản trị khác:

  $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;
    }
  }

2
Sử dụng RegEx như thế thực sự là một thực hành xấu và nên tránh. Cho đến khi tìm thấy giải pháp, bạn nên kiểm tra xem tên tuyến có phải là 'entity.node.edit_form'
Eyal

vấn đề là $ route đang trả về null, trống rỗng. Tôi sẽ không cần thực hiện regex nếu -> getRouteObject () trả về tuyến đường.
oknate

Kỳ dị. Bạn đã thử chưa\Drupal::routeMatch()->getRouteName()
Eyal

1
\Drupal::routeMatch()->getRouteName()cho tôi null (Drupal 8.3.2)
Guillaume Bois

1
Kiểm tra bổ sung của bạn bị thiếu các trang quản trị như sửa đổi nút, xóa và dịch.
Philipp Michael

9

Sau đây là ngắn gọn hơn một chút và cũng chụp các trang chỉnh sửa nút khi chúng được cấu hình để sử dụng chủ đề quản trị viên. Các isAdminRoutephương pháp sử dụng các tuyến đường hiện tại nếu không chỉ định:

  /** @var \Drupal\Core\Routing\AdminContext $admin_context */
  $admin_context = \Drupal::service('router.admin_context');
  if (!$admin_context->isAdminRoute()) {
    // perform tasks.
  }

"Chụp các trang chỉnh sửa nút khi chúng được cấu hình để sử dụng chủ đề quản trị viên" là chìa khóa ở đây. Lý do tôi đặt câu hỏi là vì tôi gặp khó khăn khi chụp các trang không có chủ đề quản trị viên như các trang chỉnh sửa nút khi họ không sử dụng chủ đề quản trị viên.
oknate

Ah, điều đó có ý nghĩa. Có, nó phức tạp hơn khi các trang chỉnh sửa nút không được đặt làm trang quản trị.
Shaun Dychko
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.