Como testar se a página atual é uma página de administrador?

9

Em algum momento, comecei a usar o código a seguir para testar se a página atual é uma página de administrador:

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

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

Mas descobri que isso falha nas páginas de edição do nó em hook_entity_load ().

Como testamos se estamos em uma página de administrador no Drupal 8? Algo como path_is_admin () no Drupal 7?

Descobri que se eu testar o mesmo caminho da página de edição de nó de fora de hook_entity_load, usando o código nesta página ( https://api.drupal.org/api/drupal/includes%21path.inc/function/path_is_admin/7.x ) funciona.

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

Mas se eu tentar adicionar esse código em hook_entity_load usando o caminho atual, recebo um loop fatal.

Acho que onde estou preso está carregando a rota atual em hook_entity_load.

oknate
fonte
11
A edição do nó não é uma página de administrador.
usar o seguinte comando
11
Você pode torná-lo um caminho de administrador alternando a opção "Usar o tema de administração ao editar ou criar conteúdo" em "Aparência". Isso faz com que todas as rotas com a opção _node_operation_routeativada também obtenham a opção _admin_route. \Drupal::service('router.admin_context')->isAdminRoute()verifica esse sinalizador para a rota atual por padrão.
TwoD

Respostas:

19

* Atualizada *

Quando eu respondi a essa pergunta, as páginas de edição de nó e edição de taxonomia não estavam definidas como rotas de administrador. Então eu adicionei verificações separadas para elas. Tais verificações separadas não são mais necessárias. O seguinte parece abordar muito bem:

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

Se você deseja verificar uma rota diferente da rota atual, pode passá-la para isAdminRoute ().

Observe que a maneira acima não funcionará para páginas de edição de nós ou páginas de edição de termos de taxonomia se você desmarcar "Usar o tema de administração ao editar ou criar conteúdo" na página de administração do tema em / admin / aparecimento. Então você precisaria de uma verificação separada.

* Resposta original: *

Para testar se uma página é uma página de administrador, você pode usar um processo de duas etapas. Como o regex para a edição do nó pode não estar usando o tema admin.

Primeiro eu uso o método isAdminRoute:

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

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

Em seguida, você pode usar uma verificação adicional para o caminho para ver se é uma página de edição de nó:

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

Aqui está uma maneira bastante elaborada, mas bastante completa, de testar páginas de edição de nós e termos de taxonomia, bem como outras rotas administrativas:

  $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
fonte
2
Usar o RegEx assim é realmente uma prática ruim e deve ser evitado. Até que uma solução seja encontrada você deve verificar se o nome da rota é 'entity.node.edit_form'
Eyal
o problema é que $ route está retornando nulo, vazio. Eu não precisaria fazer o regex se -> getRouteObject () retornasse a rota.
oknate
Esquisito. Você já tentou #\Drupal::routeMatch()->getRouteName()
Eyal
11
\Drupal::routeMatch()->getRouteName()dá-me nulo (Drupal 8.3.2)
Guillaume Bois
11
Sua verificação adicional está ausente nas páginas de administração, como revisões, exclusão e traduções de nós.
Philipp Michael
9

A seguir, é um pouco mais conciso e também captura páginas de edição de nós quando elas são configuradas para usar o tema de administrador. O isAdminRoutemétodo usa a rota atual se nenhuma for especificada:

  /** @var \Drupal\Core\Routing\AdminContext $admin_context */
  $admin_context = \Drupal::service('router.admin_context');
  if (!$admin_context->isAdminRoute()) {
    // perform tasks.
  }
Shaun Dychko
fonte
"captura as páginas de edição de nós quando estão configuradas para usar o tema do administrador" é essencial aqui. O motivo pelo qual fiz a pergunta é porque estava tendo problemas para capturar páginas com temas que não são de administrador, como páginas de edição de nós, quando não estão usando o tema de administrador.
oknate
Ah, isso faz sentido. Sim, é mais complicado quando as páginas de edição do nó não estão definidas como páginas de administrador.
Shaun Dychko