如何测试当前页面是否为管理员页面?


9

在某个时候,我开始使用以下代码来测试当前页面是否为管理页面:

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

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

但是我发现这在hook_entity_load()中的节点编辑页面上失败。

我们如何测试我们是否在Drupal 8的管理页面上?像Drupal 7中的path_is_admin()之类的东西?

我发现,如果我从外部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中加载当前路由。


1
节点编辑不是管理员页面。
ya.teck

1
通过切换“外观”下的“在编辑或创建内容时使用管理主题”选项,可以将其设置为管理路径。这样,_node_operation_route启用了该选项的所有路由也将获得option _admin_route\Drupal::service('router.admin_context')->isAdminRoute()默认情况下检查当前路由的标志。
TwoD

Answers:


19

* 更新 *

当我第一次回答这个问题时,未将节点编辑和分类法编辑页面设置为管理路由。因此,我为此添加了单独的检查。不再需要这种单独的检查。以下内容似乎很好地涵盖了它:

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

如果要检查当前路由以外的其他路由,可以将其传递给isAdminRoute()。

注意,如果在/ admin / appearance的主题管理页面上取消选中“在编辑或创建内容时使用管理主题”,则上述方法不适用于节点编辑页面或分类术语编辑页面。然后,您需要单独检查。

*原始答案:*

要测试页面是否为管理页面,可以使用两步过程。由于用于节点编辑的正则表达式可能未使用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确实是不好的做法,应该避免。在找到解决方案之前,您应该检查路由名称是否为'entity.node.edit_form'–
Eyal

问题是$ route返回空,空。如果-> getRouteObject()返回路由,则不需要进行正则表达式。
oknate,

奇怪的。您是否尝试过\Drupal::routeMatch()->getRouteName()
-Eyal

1
\Drupal::routeMatch()->getRouteName()给我空值(Drupal 8.3.2)
纪尧姆·博伊斯

1
您的其他检查缺少管理页面,例如节点修订,删除和翻译。
菲利普·迈克尔

9

以下内容更为简洁,并且在将节点编辑页面配置为使用管理主题时,它们也会捕获。isAdminRoute如果未指定,则该方法使用当前Route:

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

此处的关键是“将节点编辑页面配置为使用管理主题时捕获它们”。我之所以问这个问题,是因为我在捕获非管理主题页面(例如节点编辑页面)(例如不使用管理主题)时遇到问题。
oknate,

嗯,那很有道理。是的,当节点编辑页面未设置为管理页面时,情况会更加复杂。
Shaun Dychko '17
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.