Как проверить, является ли текущая страница страницей администратора?

9

В какой-то момент я начал использовать следующий код, чтобы проверить, является ли текущая страница страницей администратора:

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

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

Но я обнаружил, что это не удается на страницах редактирования узла в hook_entity_load ().

Как мы проверяем, если мы находимся на странице администратора в Drupal 8? Что-то вроде path_is_admin () в Drupal 7?

Я обнаружил, что если я проверяю путь редактирования страницы того же узла извне hook_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);

Но если я попытаюсь добавить этот код в hook_entity_load, используя текущий путь, я получу фатальный цикл.

Я думаю, что я застрял, загружая текущий маршрут в hook_entity_load.

oknate
источник
1
Редактирование узла не является страницей администратора.
ya.teck
1
Вы можете сделать это путем администратора, переключив опцию «Использовать тему администрирования при редактировании или создании контента» в разделе «Внешний вид». Таким образом, все маршруты с _node_operation_routeвключенной опцией также получают опцию _admin_route. \Drupal::service('router.admin_context')->isAdminRoute()проверяет этот флаг для текущего маршрута по умолчанию.
Двое

Ответы:

19

* Обновлено *

Когда я впервые ответил на этот вопрос, страницы редактирования узла и таксономии не были заданы как маршруты администратора. Поэтому я добавил отдельные проверки для тех. Такие отдельные проверки больше не нужны. Следующее, кажется, покрывает это довольно хорошо:

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

Если вы хотите проверить маршрут, отличный от текущего, вы можете передать его в isAdminRoute ().

Обратите внимание, что описанный выше способ не будет работать для страниц редактирования узла или страниц редактирования термина таксономии, если вы снимите флажок «Использовать тему администрирования при редактировании или создании контента» на странице администрирования темы в / admin / Appearance. Тогда вам понадобится отдельная проверка.

* Оригинальный ответ: *

Чтобы проверить, является ли страница страницей администратора, вы можете использовать двухэтапный процесс. Поскольку регулярное выражение для редактирования узла может не использовать тему администратора.

Сначала я использую метод 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;
    }
  }
oknate
источник
2
Подобное использование RegEx действительно плохая практика, и ее следует избегать. Пока решение не найдено, вы должны проверить, если имя маршрута 'entity.node.edit_form'
Eyal
проблема в том, что $ route возвращает ноль, пусто. Мне не нужно было бы выполнять регулярное выражение, если -> getRouteObject () вернул маршрут.
oknate
Weird. Вы пробовали\Drupal::routeMatch()->getRouteName()
Eyal
1
\Drupal::routeMatch()->getRouteName()дает мне ноль (Drupal 8.3.2)
Гийом Буа
1
В вашей дополнительной проверке отсутствуют страницы администратора, такие как ревизии узлов, удаление и переводы.
Филипп Майкл
9

Следующее является более кратким, и также захватывает страницы редактирования узла, когда они настроены на использование темы администратора. isAdminRouteМетод использует текущий маршрут , если он не указан:

  /** @var \Drupal\Core\Routing\AdminContext $admin_context */
  $admin_context = \Drupal::service('router.admin_context');
  if (!$admin_context->isAdminRoute()) {
    // perform tasks.
  }
Шон Дычко
источник
"захватывает страницы редактирования узла, когда они настроены на использование темы администратора" - это ключ здесь. Причина, по которой я задал вопрос, заключается в том, что у меня возникли проблемы с захватом страниц, не относящихся к теме администратора, таких как страницы редактирования узла, когда они не используют тему администратора.
oknate
Ах, это имеет смысл. Да, это сложнее, когда страницы редактирования узла не заданы как страницы администратора.
Шон Дычко