Come verificare se la pagina corrente è una pagina di amministrazione?


9

Ad un certo punto ho iniziato a utilizzare il seguente codice per verificare se la pagina corrente è una pagina di amministrazione:

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

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

Ma ho scoperto che questo non riesce nelle pagine di modifica dei nodi in hook_entity_load ().

Come testiamo se ci troviamo in una pagina di amministrazione in Drupal 8? Qualcosa come path_is_admin () in Drupal 7?

Ho scoperto che se provo lo stesso nodo modifica il percorso della pagina da hook_entity_load esterno, usando il codice in questa pagina ( https://api.drupal.org/api/drupal/includes%21path.inc/function/path_is_admin/7.x ) Funziona.

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

Ma se provo ad aggiungere questo codice in hook_entity_load usando il percorso corrente, ottengo un ciclo fatale.

Penso che dove sono bloccato sta caricando la rotta corrente in hook_entity_load.


1
La modifica del nodo non è una pagina di amministrazione.
ya.teck

1
Puoi renderlo un percorso di amministrazione attivando l'opzione "Usa il tema di amministrazione durante la modifica o la creazione di contenuti" in "Aspetto". Ciò rende anche tutte le rotte con l'opzione _node_operation_routeabilitata _admin_route. \Drupal::service('router.admin_context')->isAdminRoute()controlla che contrassegni il percorso corrente per impostazione predefinita.
TwoD

Risposte:


19

* Aggiornato *

Quando ho risposto per la prima volta a questa domanda, le pagine di modifica dei nodi e di tassonomia non erano impostate come percorsi di amministrazione. Quindi ho aggiunto controlli separati per quelli. Tali controlli separati non sono più necessari. Quanto segue sembra coprirlo abbastanza bene:

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

Se si desidera controllare un percorso diverso da quello corrente, è possibile passarlo in isAdminRoute ().

Nota: il modo sopra descritto non funzionerà per le pagine di modifica dei nodi o per le pagine di modifica dei termini della tassonomia se si deseleziona "Usa il tema di amministrazione durante la modifica o la creazione di contenuto" nella pagina di amministrazione del tema in / admin / aspetto. Quindi avresti bisogno di un controllo separato.

* Risposta originale: *

Per verificare se una pagina è una pagina di amministrazione, è possibile utilizzare una procedura in due passaggi. Poiché regex per la modifica del nodo potrebbe non utilizzare il tema admin.

Per prima cosa uso il metodo isAdminRoute:

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

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

Quindi è possibile utilizzare un controllo aggiuntivo per il percorso per vedere se si tratta di una pagina di modifica del nodo:

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

Ecco un modo abbastanza elaborato, ma abbastanza completo per testare le pagine di modifica dei termini del nodo e della tassonomia e altre rotte di amministrazione:

  $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
L'uso di RegEx in questo modo è davvero una cattiva pratica e dovrebbe essere evitato. Fino a quando non viene trovata una soluzione, è necessario verificare se il nome del percorso è "entity.node.edit_form"
Eyal

il problema è $ route sta restituendo null, vuoto. Non avrei bisogno di fare il regex se -> getRouteObject () ha restituito il percorso.
oknate

Strano. Hai provato\Drupal::routeMatch()->getRouteName()
Eyal,

1
\Drupal::routeMatch()->getRouteName()mi dà null (Drupal 8.3.2)
Guillaume Bois,

1
Nel tuo controllo aggiuntivo mancano pagine di amministrazione come revisioni, eliminazioni e traduzioni dei nodi.
Philipp Michael,

9

Di seguito è un po 'più conciso e acquisisce anche le pagine di modifica dei nodi quando sono configurate per utilizzare il tema di amministrazione. Il isAdminRoutemetodo utilizza la route corrente se non ne viene specificata alcuna:

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

"Cattura le pagine di modifica dei nodi quando sono configurate per utilizzare il tema admin" è la chiave qui. Il motivo per cui ho posto la domanda è perché ho avuto problemi con l'acquisizione di pagine non a tema amministrativo come le pagine di modifica dei nodi quando non utilizzano il tema amministratore.
Oknate,

Ah, ha senso. Sì, è più complicato quando le pagine di modifica del nodo non sono impostate come pagine di amministrazione.
Shaun Dychko,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.