現在のページが管理ページかどうかをテストする方法は?


9

ある時点で、次のコードを使用して、現在のページが管理ページであるかどうかをテストし始めました。

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

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

しかし、hook_entity_load()のノード編集ページでこれが失敗することがわかりました。

Drupal 8の管理ページにいるかどうかをどのようにテストしますか?Drupal 7のpath_is_admin()のようなものですか?

このページのコード(https://api.drupal.org/api/drupal/includes%21path.inc/function/path_is_admin/7.x)を使用して、hook_entity_loadの外側から同じノード編集ページのパスをテストすると、) できます。

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有効になっているすべてのルートがオプションも取得します_admin_route\Drupal::service('router.admin_context')->isAdminRoute()デフォルトでは、現在のルートのフラグをチェックします。
TwoD 2017年

回答:


19

* 更新しました *

私が最初にこの質問に回答したとき、ノード編集ページと分類編集ページは管理ルートとして設定されていませんでした。そのため、それらの個別のチェックを追加しました。このような個別のチェックはもう必要ありません。以下はそれをかなりうまくカバーしているようです:

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

現在のルート以外のルートを確認したい場合は、isAdminRoute()に渡すことができます。

/ admin / appearanceのテーマ管理ページで[コンテンツを編集または作成するときに管理テーマを使用する]をオフにすると、上記の方法はノード編集ページまたは分類用語編集ページでは機能しません。次に、別のチェックが必要になります。

*元の回答:*

ページが管理ページかどうかをテストするには、2段階のプロセスを使用できます。ノード編集の正規表現は管理テーマを使用していない可能性があるため。

まず、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がnull、空を返すことです。-> getRouteObject()がルートを返した場合、正規表現を実行する必要はありません。
oknate 2016年

変だ。お試しになりましたか\Drupal::routeMatch()->getRouteName()
Eyal

1
\Drupal::routeMatch()->getRouteName()ヌル(Drupal 8.3.2)
Guillaume Bois

1
追加のチェックで、ノードリビジョン、削除、翻訳などの管理ページが欠落しています。
フィリップマイケル

9

以下はもう少し簡潔で、管理テーマを使用するように構成されている場合にノード編集ページもキャプチャします。isAdminRoute何も指定されていない場合、このメソッドは、現在のルートを使用しています。

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

ここで重要なのは、「管理テーマを使用するように構成されているときにノード編集ページをキャプチャする」ことです。私が質問した理由は、管理テーマを使用していないときにノード編集ページなどの管理テーマ以外のページをキャプチャするときに問題が発生したためです。
oknate 2017年

ああ、それは理にかなっています。はい、ノード編集ページが管理ページとして設定されていない場合は、さらに複雑になります。
Shaun Dychko
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.