¿Cómo probar si la página actual es una página de administrador?


9

En algún momento comencé a usar el siguiente código para probar si la página actual es una página de administración:

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

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

Pero descubrí que esto falla en las páginas de edición de nodos en hook_entity_load ().

¿Cómo probamos si estamos en una página de administrador en Drupal 8? ¿Algo así como path_is_admin () en Drupal 7?

Descubrí que si pruebo la misma ruta de la página de edición de nodos desde fuera de hook_entity_load, usando el código de esta 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);

Pero si trato de agregar este código en hook_entity_load usando la ruta actual, me sale un bucle fatal.

Creo que donde estoy atascado está cargando la ruta actual en hook_entity_load.


1
La edición de nodos no es una página de administración.
ya.teck

1
Puede convertirlo en una ruta de administrador activando la opción "Usar el tema de administración al editar o crear contenido" en "Apariencia". Eso hace que todas las rutas con la opción _node_operation_routehabilitada también obtengan la opción _admin_route. \Drupal::service('router.admin_context')->isAdminRoute()comprueba esa bandera para la ruta actual de forma predeterminada.
TwoD

Respuestas:


19

* Actualizado *

Cuando respondí por primera vez a esta pregunta, las páginas de edición de nodo y edición de taxonomía no se configuraron como rutas de administración. Así que agregué cheques separados para esos. Tales controles separados ya no son necesarios. Lo siguiente parece cubrirlo bastante bien:

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

Si desea verificar una ruta que no sea la ruta actual, puede pasarla a isAdminRoute ().

Tenga en cuenta que la forma anterior no funcionará para páginas de edición de nodos o páginas de edición de términos de taxonomía si desmarca "Usar el tema de administración al editar o crear contenido" en la página de administración del tema en / admin / apariencia. Entonces necesitarías un cheque por separado.

* Respuesta original: *

Para probar si una página es una página de administrador, puede usar un proceso de dos pasos. Dado que regex para la edición de nodos puede no estar usando el tema de administración.

Primero uso el método isAdminRoute:

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

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

Luego puede usar una verificación adicional de la ruta para ver si se trata de una página de edición de nodos:

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

Aquí hay una forma bastante elaborada pero bastante completa de probar páginas de edición de términos de nodo y taxonomía, así como otras rutas de administración:

  $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
Usar RegEx así es una mala práctica y debe evitarse. Hasta que se encuentre una solución, debe verificar si el nombre de la ruta es 'entity.node.edit_form'
Eyal el

el problema es que $ route devuelve nulo, vacío. No necesitaría hacer la expresión regular si -> getRouteObject () devolvió la ruta.
Oknate

Extraño. ¿Has probado\Drupal::routeMatch()->getRouteName()
Eyal

1
\Drupal::routeMatch()->getRouteName()me da nulo (Drupal 8.3.2)
Guillaume Bois

1
A su verificación adicional le faltan páginas de administración, como revisiones de nodos, eliminación y traducciones.
Philipp Michael

9

Lo siguiente es un poco más conciso, y también captura páginas de edición de nodos cuando están configuradas para usar el tema de administración. El isAdminRoutemétodo usa la ruta actual si no se especifica ninguno:

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

"captura páginas de edición de nodos cuando están configuradas para usar el tema de administrador" es clave aquí. La razón por la que hice la pregunta es porque estaba teniendo problemas para capturar páginas que no son de tema de administrador, como las páginas de edición de nodos cuando no están usando el tema de administrador.
Oknate

Ah, eso tiene sentido. Sí, es más complicado cuando las páginas de edición de nodos no están configuradas como páginas de administrador.
Shaun Dychko
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.