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.

oknate
źródło
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;
    }
  }
oknate
źródło
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.
  }
Shaun Dychko
źródło
„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