Mevcut sayfanın bir yönetici sayfası olup olmadığını nasıl test edebilirim?


9

Bir noktada, geçerli sayfanın bir yönetici sayfası olup olmadığını test etmek için aşağıdaki kodu kullanmaya başladım:

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

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

Ancak bunun hook_entity_load () içindeki düğüm düzenleme sayfalarında başarısız olduğunu gördüm.

Drupal 8'de bir yönetici sayfasında olup olmadığımızı nasıl test edebiliriz? Drupal 7'de path_is_admin () gibi bir şey mi?

Aynı düğüm düzenleme sayfası yolunu hook_entity_load dışından test edersem, bu sayfadaki kodu kullanarak buldum ( https://api.drupal.org/api/drupal/includes%21path.inc/function/path_is_admin/7.x ) işe yarıyor.

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

Ama geçerli yolu kullanarak hook_entity_load bu kodu eklemek çalışırsanız, ölümcül bir döngü olsun.

Sıkıştığım yerde hook_entity_load geçerli yolu yüklüyor düşünüyorum.


1
Düğüm düzenleme bir yönetici sayfası değil.
ya.teck

1
"Görünüm" altındaki "İçerik düzenlerken veya oluştururken yönetim temasını kullan" seçeneğini değiştirerek yönetici yolu yapabilirsiniz. Bu seçeneği _node_operation_routeetkin tüm seçenek ile yapar da seçeneği olsun _admin_route. \Drupal::service('router.admin_context')->isAdminRoute()varsayılan olarak geçerli rotayı işaretler.
TwoD

Yanıtlar:


19

* Güncellenmiş *

Bu soruyu ilk kez yanıtladığımda, düğüm düzenleme ve sınıflandırma düzenleme sayfaları yönetici yolu olarak ayarlanmadı. Bu yüzden onlar için ayrı kontroller ekledim. Bu tür ayrı kontroller artık gerekli değildir. Aşağıdakiler oldukça iyi örtüyor gibi görünüyor:

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

Geçerli rotadan başka bir rotayı kontrol etmek istiyorsanız, rotayı isAdminRoute () öğesine aktarabilirsiniz.

Not: / admin / view tema teması sayfasında "İçerik düzenlerken veya oluştururken yönetim temasını kullan" seçeneğinin işaretini kaldırırsanız, yukarıdaki yolun düğüm düzenleme sayfaları veya sınıflandırma terimi düzenleme sayfaları için çalışmaz. O zaman ayrı bir kontrole ihtiyacınız olacak.

* Orijinal Cevap: *

Bir sayfanın yönetici sayfası olup olmadığını test etmek için iki adımlı bir işlem kullanabilirsiniz. Düğüm düzenlemesi için normal ifade yönetici temasını kullanmıyor olabilir.

Önce isAdminRoute yöntemini kullanıyorum:

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

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

Ardından, düğüm düzenleme sayfası olup olmadığını görmek için yol için ek bir denetim kullanabilirsiniz:

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

Düğüm ve sınıflandırma terimi düzenleme sayfalarını ve diğer yönetici yollarını test etmenin oldukça ayrıntılı, ancak oldukça eksiksiz bir yolu:

  $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
RegEx'in bu şekilde kullanılması gerçekten kötü bir uygulamadır ve kaçınılmalıdır. Bir çözüm bulunana kadar, rota adının 'entity.node.edit_form'
Eyal

Sorun $ route boş, boş döndürüyor olmasıdır. -> getRouteObject () yol döndürdü regex yapmak gerekmez.
16:45, oknate

Tuhaf. Denediniz mi\Drupal::routeMatch()->getRouteName()
Eyal

1
\Drupal::routeMatch()->getRouteName()bana null veriyor (Drupal 8.3.2)
Guillaume Bois

1
Ek kontrolünüzde düğüm revizyonları, silme ve çeviriler gibi yönetici sayfaları eksik.
Philipp Michael

10

Aşağıdakiler biraz daha özlüdür ve ayrıca yönetici temasını kullanacak şekilde yapılandırıldıklarında düğüm düzenleme sayfalarını yakalar. isAdminRouteBelirtilmezse yöntem geçerli Rota kullanır:

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

"yönetici temasını kullanacak şekilde yapılandırıldıklarında düğüm düzenleme sayfalarını yakalar" burada önemlidir. Soruyu sormamın nedeni, yönetici temasını kullanmadığı zaman düğüm düzenleme sayfaları gibi yönetici olmayan tema sayfalarını yakalamakta sorun yaşıyordum.
17'de oknate

Ah, bu mantıklı. Evet, düğüm düzenleme sayfaları yönetici sayfası olarak ayarlanmadığında daha karmaşıktır.
Shaun Dychko
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.