현재 페이지가 관리자 페이지인지 테스트하는 방법은 무엇입니까?


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활성화 된 모든 경로 도 옵션 을 얻습니다 _admin_route. \Drupal::service('router.admin_context')->isAdminRoute()기본적으로 현재 경로에 대한 플래그를 확인합니다.
TwoD

답변:


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

기묘한. 시도해 보셨습니까\Drupal::routeMatch()->getRouteName()
Eyal

1
\Drupal::routeMatch()->getRouteName()나에게 null을 제공합니다 (Drupal 8.3.2)

1
추가 확인에 노드 개정, 삭제 및 변환과 같은 관리 페이지가 없습니다.
Philipp Michael

10

다음은 조금 더 간결하며 관리 테마를 사용하도록 구성된 노드 편집 페이지를 캡처합니다. isAdminRoute것도 지정하지 않으면 메서드는 현재 경로를 사용합니다 :

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

"관리자 테마를 사용하도록 구성된 경우 캡처 노드 편집 페이지"가 ​​핵심입니다. 내가 질문 한 이유는 관리 테마를 사용하지 않을 때 노드 편집 페이지와 같은 비 관리 테마 페이지를 캡처하는 데 문제가 있었기 때문입니다.
oknate

아, 말이 되네요. 예, 노드 편집 페이지가 관리 페이지로 설정되어 있지 않으면 더 복잡합니다.
Shaun Dychko
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.