Як перевірити, чи поточна сторінка є адміністратором?


9

У якийсь момент я почав використовувати наступний код, щоб перевірити, чи поточна сторінка є адміністраторською сторінкою:

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

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

Але я виявив, що це не вдається на сторінках редагування вузлів у куці__тит_завантаження ().

Як ми перевіряємо, чи знаходимось ми на сторінці адміністратора в Drupal 8? Щось на зразок path_is_admin () в Drupal 7?

Я виявив, що якщо я перевіряю той самий вузол для редагування шляху до сторінки із зовнішньої гачки_entity_load, використовуючи код на цій сторінці ( https://api.drupal.org/api/drupal/includes%21path.inc/function/path_is_admin/7.x ) це працює.

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

Але якщо я спробую додати цей код у mock_entity_load за допомогою поточного шляху, я отримаю фатальний цикл.

Я думаю, де я застряг - це завантаження поточного маршруту в mock_entity_load.


1
Редагування вузла - це не адміністративна сторінка.
ya.teck

1
Ви можете зробити його адміністративним шляхом, увімкнувши параметр "Використовувати тему адміністрування під час редагування чи створення вмісту" у розділі "Зовнішній вигляд". Завдяки цьому всі маршрути з _node_operation_routeувімкненою опцією також отримують цю опцію _admin_route. \Drupal::service('router.admin_context')->isAdminRoute()перевіряє цей прапор на поточний маршрут за замовчуванням.
TwoD

Відповіді:


19

* Оновлено *

Коли я вперше відповів на це питання, сторінки редагування вузлів та систематики таксономії не були встановлені як маршрути адміністратора. Тому я додав окремі чеки для них. Такі окремі перевірки вже не потрібні. Здається, це досить добре висвітлює:

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

Якщо ви хочете перевірити маршрут, відмінний від поточного, ви можете передати його в isAdminRoute ().

Зауважте, що вищевказаний спосіб не працюватиме на сторінках редагування вузлів або сторінках редагування термінів таксономії, якщо ви зніміть прапорець "Використовувати тему адміністрування під час редагування або створення вмісту" на сторінці адміністратора теми за адресою / admin / появи. Тоді вам знадобиться окремий чек.

* Оригінальна відповідь: *

Щоб перевірити, чи є сторінка адміністративною сторінкою, ви можете скористатися двоетапним процесом. Оскільки регулярний вираз для редагування вузла може не використовувати тему адміністратора.

Спочатку я використовую метод isAdminRoute:

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

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

Тоді ви можете скористатися додатковою перевіркою для шляху, щоб побачити, чи це сторінка редагування вузла:

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

Ось досить складний, але досить повний спосіб перевірити наявність редагування сторінок вузла та систематики, а також інші маршрути адміністрування:

  $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
Використання подібного RegEx - це справді погана практика, і цього слід уникати. Поки не знайдеться рішення, слід перевірити, чи назва маршруту - "ent.node.edit_form"
Eyal

проблема полягає в тому, що $ route повертається нульовим, порожнім. Мені не потрібно було б робити регулярний вираз, якщо -> getRouteObject () повернув маршрут.
окната

Дивно. Ви пробували\Drupal::routeMatch()->getRouteName()
Eyal

1
\Drupal::routeMatch()->getRouteName()дає мені нуль (Drupal 8.3.2)
Гійом Буа

1
У вашій додатковій перевірці відсутні сторінки адміністратора, такі як редакція вузла, видалення та переклади.
Філіп Майкл

10

Далі - трохи більш стислий, а також фіксує сторінки редагування вузлів, коли вони налаштовані на використання теми адміністратора. isAdminRouteМетод використовує поточний маршрут , якщо він не вказана:

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

"Захоплює сторінки редагування вузлів, коли вони налаштовані на використання теми адміністратора" тут є ключовим. Причина, що я задав це питання, полягає в тому, що у мене виникли проблеми з захопленням сторінок, які не є адміністратором, такими як сторінки редагування вузлів, коли вони не використовують тему адміністратора.
окната

Ах, це має сенс. Так, це складніше, коли сторінки редагування вузла не встановлені як сторінки адміністратора.
Шаун Дичко
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.