Jak sprawdzić, czy bieżąca strona jest stroną administratora?


9

W pewnym momencie zacząłem używać następującego kodu, aby sprawdzić, czy bieżąca strona jest stroną administracyjną:

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

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

Ale odkryłem, że to się nie udaje na stronach edycji węzłów w hook_entity_load ().

Jak sprawdzamy, czy jesteśmy na stronie administratora w Drupal 8? Coś jak path_is_admin () w Drupal 7?

Odkryłem, że jeśli przetestuję tę samą ścieżkę edycji strony węzła z zewnątrz hook_entity_load, używając kodu na tej stronie ( https://api.drupal.org/api/drupal/includes%21path.inc/function/path_is_admin/7.x ) to działa.

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

Ale jeśli spróbuję dodać ten kod do hook_entity_load przy użyciu bieżącej ścieżki, otrzymam krytyczną pętlę.

Myślę, że gdzie utknąłem, ładuję bieżącą trasę do hook_entity_load.


1
Edycja węzła nie jest stroną administracyjną.
— ya.teck

1
Możesz ustawić ścieżkę administratora, przełączając opcję „Użyj motywu administracyjnego podczas edytowania lub tworzenia treści” w „Wygląd”. To sprawia, że ​​wszystkie trasy z _node_operation_routewłączoną opcją również mają tę opcję _admin_route. \Drupal::service('router.admin_context')->isAdminRoute()domyślnie sprawdza tę flagę dla bieżącej trasy.
— TwoD

Odpowiedzi:


19

* Zaktualizowano *

Kiedy po raz pierwszy odpowiedziałem na to pytanie, strony edycji węzłów i edycji taksonomii nie były ustawione jako trasy administracyjne. Dodałem więc osobne kontrole dla nich. Takie oddzielne kontrole nie są już konieczne. Wydaje się, że dość dobrze obejmuje to:

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

Jeśli chcesz sprawdzić trasę inną niż bieżąca, możesz przekazać ją do isAdminRoute ().

Uwaga: powyższy sposób nie będzie działał dla stron edycji węzłów lub stron edycji terminów, jeśli odznaczysz opcję „Użyj motywu administracyjnego podczas edytowania lub tworzenia treści” na stronie administratora motywu w / admin / wygląd. Wtedy potrzebujesz osobnego czeku.

* Oryginalna odpowiedź: *

Aby sprawdzić, czy strona jest stroną administracyjną, możesz skorzystać z dwuetapowego procesu. Ponieważ wyrażenie regularne dla edycji węzła może nie używać motywu administratora.

Najpierw używam metody isAdminRoute:

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

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

Następnie możesz użyć dodatkowego sprawdzenia ścieżki, aby zobaczyć, czy jest to strona edycji węzła:

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

Oto dość skomplikowany, ale całkiem kompletny sposób na przetestowanie stron edycji terminów węzłów i taksonomii, a także innych dróg administracyjnych:

  $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
Używanie RegEx w ten sposób jest rzeczywiście złą praktyką i należy go unikać. Do czasu znalezienia rozwiązania należy sprawdzić, czy nazwa trasy to „entity.node.edit_form”
— Eyal

problem polega na tym, że $ route zwraca wartość null, pusta. Nie musiałbym wykonywać wyrażenia regularnego, jeśli -> getRouteObject () zwrócił trasę.
— oknate

Dziwne. Czy próbowałeś\Drupal::routeMatch()->getRouteName()
— Eyal

1
\Drupal::routeMatch()->getRouteName()daje mi null (Drupal 8.3.2)
— Guillaume Bois

1
W dodatkowej kontroli brakuje stron administracyjnych, takich jak wersje węzłów, usuwanie i tłumaczenia.
— Philipp Michael

10

Poniższe jest nieco bardziej zwięzłe, a także przechwytuje strony edycji węzłów, gdy są skonfigurowane do korzystania z motywu administratora. isAdminRouteMetoda wykorzystuje aktualnej trasie, jeżeli nie zostały podane:

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

„przechwytuje strony edycji węzłów, gdy są skonfigurowane do korzystania z motywu administratora”. Powodem, dla którego zadałem to pytanie, jest to, że miałem problemy z przechwytywaniem stron nie-administracyjnych, takich jak strony edycji węzłów, gdy nie używają motywu administracyjnego.
— oknate

Ach, to ma sens. Tak, jest to bardziej skomplikowane, gdy strony edycji węzła nie są ustawione jako strony administracyjne.
— Shaun Dychko
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.