Wie teste ich, ob die aktuelle Seite eine Administrationsseite ist?

9

Irgendwann habe ich angefangen, den folgenden Code zu verwenden, um zu testen, ob die aktuelle Seite eine Administrationsseite ist:

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

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

Ich habe jedoch festgestellt, dass dies auf Knotenbearbeitungsseiten in hook_entity_load () fehlschlägt.

Wie testen wir, ob wir uns in Drupal 8 auf einer Administrationsseite befinden? So etwas wie path_is_admin () in Drupal 7?

Ich habe festgestellt, dass, wenn ich denselben Knotenbearbeitungsseitenpfad von außerhalb von hook_entity_load teste, der Code auf dieser Seite verwendet wird ( https://api.drupal.org/api/drupal/includes%21path.inc/function/path_is_admin/7.x) ) Es klappt.

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

Wenn ich jedoch versuche, diesen Code unter Verwendung des aktuellen Pfads in hook_entity_load hinzuzufügen, wird eine schwerwiegende Schleife angezeigt.

Ich denke, wo ich feststecke, wird die aktuelle Route in hook_entity_load geladen.

oknate
quelle
1
Die Knotenbearbeitung ist keine Administrationsseite.
ya.teck
1
Sie können es zu einem Administratorpfad machen, indem Sie unter "Darstellung" die Option "Verwaltungsthema beim Bearbeiten oder Erstellen von Inhalten verwenden" aktivieren. Dadurch erhalten alle Routen mit _node_operation_routeaktivierter Option auch die Option _admin_route. \Drupal::service('router.admin_context')->isAdminRoute()Überprüft dieses Flag standardmäßig auf die aktuelle Route.
TwoD

Antworten:

19

* Aktualisiert *

Als ich diese Frage zum ersten Mal beantwortete, wurden die Seiten zum Bearbeiten von Knoten und zum Bearbeiten von Taxonomien nicht als Administratorrouten festgelegt. Also habe ich separate Schecks für diese hinzugefügt. Solche separaten Prüfungen sind nicht mehr erforderlich. Folgendes scheint es ziemlich gut abzudecken:

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

Wenn Sie eine andere Route als die aktuelle Route überprüfen möchten, können Sie sie an isAdminRoute () übergeben.

Beachten Sie, dass die oben beschriebene Methode nicht für Knotenbearbeitungsseiten oder Seiten zum Bearbeiten von Taxonomiebegriffen funktioniert, wenn Sie auf der Themenadministrationsseite unter / admin / Erscheinungsbild die Option "Verwaltungsthema beim Bearbeiten oder Erstellen von Inhalten verwenden" deaktivieren. Dann brauchen Sie einen separaten Scheck.

* Ursprüngliche Antwort: *

Um zu testen, ob eine Seite eine Administrationsseite ist, können Sie einen zweistufigen Prozess verwenden. Da Regex für die Knotenbearbeitung möglicherweise nicht das Admin-Design verwendet.

Zuerst benutze ich die isAdminRoute-Methode:

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

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

Anschließend können Sie den Pfad zusätzlich überprüfen, um festzustellen, ob es sich um eine Knotenbearbeitungsseite handelt:

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

Hier ist eine ziemlich ausgefeilte, aber ziemlich vollständige Methode zum Testen der Bearbeitungsseiten für Knoten- und Taxonomiebegriffe sowie anderer Administratorrouten:

  $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
quelle
2
Die Verwendung von RegEx ist in der Tat eine schlechte Praxis und sollte vermieden werden. Bis eine Lösung gefunden ist, sollten Sie überprüfen, ob der Routenname 'entity.node.edit_form' lautet
Eyal
Das Problem ist, dass $ route null zurückgibt, leer. Ich würde den Regex nicht machen müssen, wenn -> getRouteObject () die Route zurückgeben würde.
oknate
Seltsam. Haben Sie versucht\Drupal::routeMatch()->getRouteName()
Eyal
1
\Drupal::routeMatch()->getRouteName()gibt mir null (Drupal 8.3.2)
Guillaume Bois
1
Bei Ihrer zusätzlichen Prüfung fehlen Administrationsseiten wie Knotenrevisionen, Löschen und Übersetzungen.
Philipp Michael
9

Das Folgende ist etwas prägnanter und erfasst auch Knotenbearbeitungsseiten, wenn sie für die Verwendung des Admin-Themas konfiguriert sind. Die isAdminRouteMethode verwendet die aktuelle Route, wenn keine angegeben ist:

  /** @var \Drupal\Core\Routing\AdminContext $admin_context */
  $admin_context = \Drupal::service('router.admin_context');
  if (!$admin_context->isAdminRoute()) {
    // perform tasks.
  }
Shaun Dychko
quelle
"Erfasst Knotenbearbeitungsseiten, wenn sie für die Verwendung des Admin-Themas konfiguriert sind" ist hier der Schlüssel. Der Grund, warum ich die Frage gestellt habe, ist, dass ich Probleme beim Erfassen von Seiten hatte, die keine Administratorthemen sind, z. B. Seiten zum Bearbeiten von Knoten, wenn sie das Administratorthema nicht verwenden.
oknate
Ah, das macht Sinn. Ja, es ist komplizierter, wenn die Knotenbearbeitungsseiten nicht als Administrationsseiten festgelegt sind.
Shaun Dychko