web-dev-qa-db-fra.com

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

À 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 trouvé que si je testais le même chemin de page d'édition de noeud 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.

9
oknate

* mis à 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 peut-être 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;
    }
  }
19
oknate

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 méthode isAdminRoute 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.
  }
9
Shaun Dychko