Comment tester si la page actuelle est une page d'administration?

9

À un moment donné, j'ai commencé à utiliser le code suivant pour tester si la page actuelle est une page d'administration:

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

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

Mais j'ai trouvé que cela échoue sur les pages d'édition de noeud dans hook_entity_load ().

Comment tester si nous sommes sur une page d'administration dans Drupal 8? Quelque chose comme path_is_admin () dans Drupal 7?

J'ai constaté que si je testais le même chemin de page de modification de nœud depuis l'extérieur hook_entity_load, en utilisant le code de cette page ( https://api.drupal.org/api/drupal/includes%21path.inc/function/path_is_admin/7.x ) Ça marche.

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

Mais si j'essaye d'ajouter ce code dans hook_entity_load en utilisant le chemin actuel, j'obtiens une boucle fatale.

Je pense que là où je suis bloqué, c'est le chargement de la route actuelle dans hook_entity_load.

oknate
la source
1
La modification de nœud n'est pas une page d'administration.
ya.teck
1
Vous pouvez en faire un chemin administrateur en basculant l'option "Utiliser le thème d'administration lors de l'édition ou de la création de contenu" sous "Apparence". Cela rend toutes les routes avec l'option _node_operation_routeactivée obtenir également l'option _admin_route. \Drupal::service('router.admin_context')->isAdminRoute()vérifie cet indicateur pour l'itinéraire actuel par défaut.
TwoD

Réponses:

19

* Mise à jour *

Lorsque j'ai répondu à cette question pour la première fois, les pages de modification des nœuds et de taxonomie n'étaient pas définies comme routes d'administration. J'ai donc ajouté des contrôles séparés pour ceux-ci. De tels contrôles séparés ne sont plus nécessaires. Ce qui suit semble assez bien le couvrir:

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

Si vous souhaitez vérifier un itinéraire autre que l'itinéraire actuel, vous pouvez le passer dans isAdminRoute ().

Remarque, la méthode ci-dessus ne fonctionnera pas pour les pages de modification de nœud ou les pages de modification de terme de taxonomie si vous décochez "Utiliser le thème d'administration lors de la modification ou de la création de contenu" sur la page d'administration du thème dans / admin / apparence. Ensuite, vous auriez besoin d'un chèque séparé.

* Réponse originale: *

Pour tester si une page est une page d'administration, vous pouvez utiliser un processus en deux étapes. Étant donné que l'expression régulière pour la modification du nœud n'utilise pas le thème d'administration.

J'utilise d'abord la méthode isAdminRoute:

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

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

Ensuite, vous pouvez utiliser une vérification supplémentaire du chemin pour voir s'il s'agit d'une page d'édition de nœud:

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

Voici un moyen assez élaboré mais assez complet de tester les pages de modification des nœuds et des termes de taxonomie ainsi que d'autres routes d'administration:

  $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
la source
2
L'utilisation de RegEx comme cela est en effet une mauvaise pratique et doit être évitée. Jusqu'à ce qu'une solution soit trouvée, vous devriez vérifier si le nom de l'itinéraire est 'entity.node.edit_form'
Eyal
le problème est que $ route retourne null, vide. Je n'aurais pas besoin de faire l'expression régulière si -> getRouteObject () renvoyait la route.
Oknate
Bizarre. Avez-vous essayé\Drupal::routeMatch()->getRouteName()
Eyal
1
\Drupal::routeMatch()->getRouteName()me donne nul (Drupal 8.3.2)
Guillaume Bois
1
Votre vérification supplémentaire manque des pages d'administration comme les révisions, les suppressions et les traductions de nœuds.
Philipp Michael
9

Ce qui suit est un peu plus concis et capture également les pages de modification des nœuds lorsqu'ils sont configurés pour utiliser le thème d'administration. La isAdminRouteméthode utilise la Route actuelle si aucune n'est spécifiée:

  /** @var \Drupal\Core\Routing\AdminContext $admin_context */
  $admin_context = \Drupal::service('router.admin_context');
  if (!$admin_context->isAdminRoute()) {
    // perform tasks.
  }
Shaun Dychko
la source
"capture les pages de modification des nœuds lorsqu'ils sont configurés pour utiliser le thème d'administration" est la clé ici. La raison pour laquelle j'ai posé la question, c'est parce que j'avais du mal à capturer des pages non-admin-theme telles que les pages d'édition de nœuds quand elles n'utilisent pas le thème admin.
oknate
Ah, ça a du sens. Oui, c'est plus compliqué lorsque les pages de modification des nœuds ne sont pas définies comme pages d'administration.
Shaun Dychko