จะทดสอบว่าหน้าปัจจุบันเป็นหน้าผู้ดูแลระบบได้อย่างไร?


9

เมื่อถึงจุดหนึ่งฉันเริ่มใช้รหัสต่อไปนี้เพื่อทดสอบว่าหน้าปัจจุบันเป็นหน้าผู้ดูแลระบบหรือไม่:

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

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

แต่ฉันพบว่าสิ่งนี้ล้มเหลวบนโหนดแก้ไขหน้าใน hook_entity_load ()

เราจะทดสอบว่าเราอยู่ในหน้าผู้ดูแลระบบใน Drupal 8 ได้อย่างไร มีบางอย่างที่เหมือนกับ path_is_admin () ใน Drupal 7 ใช่ไหม

ฉันพบว่าหากฉันทดสอบโหนดเดียวกันแก้ไขเส้นทางของหน้าเว็บจาก hook_entity_load ภายนอกโดยใช้รหัสในหน้านี้ ( https://api.drupal.org/api/drupal/includes%21path.inc/function/path_is_admin/7.x ) มันได้ผล.

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

แต่ถ้าฉันพยายามที่จะเพิ่มรหัสนี้ใน hook_entity_load โดยใช้เส้นทางปัจจุบันฉันจะได้รับห่วงร้ายแรง

ฉันคิดว่าฉันติดอยู่ที่ไหนกำลังโหลดเส้นทางปัจจุบันใน hook_entity_load


1
การแก้ไขโหนดไม่ใช่หน้าผู้ดูแลระบบ
ya.teck

1
คุณสามารถทำให้เป็นเส้นทางของผู้ดูแลระบบได้โดยการเลือกตัวเลือก "ใช้ชุดรูปแบบการดูแลเมื่อแก้ไขหรือสร้างเนื้อหา" ภายใต้ "ลักษณะที่ปรากฏ" ที่ทำให้ทุกเส้นทางมีตัวเลือกในการเปิดใช้งานยังได้รับตัวเลือก_node_operation_route ตรวจสอบการตั้งค่าสถานะนั้นสำหรับเส้นทางปัจจุบันตามค่าเริ่มต้น _admin_route\Drupal::service('router.admin_context')->isAdminRoute()
2560

คำตอบ:


19

* อัปเดต *

เมื่อฉันตอบคำถามนี้ครั้งแรกการแก้ไขโหนดและหน้าแก้ไขอนุกรมวิธานไม่ได้ถูกกำหนดเป็นเส้นทางของผู้ดูแลระบบ ดังนั้นฉันจึงเพิ่มการตรวจสอบแยกต่างหากสำหรับสิ่งเหล่านั้น การตรวจสอบแยกดังกล่าวไม่จำเป็นอีกต่อไป ต่อไปนี้ดูเหมือนจะครอบคลุมได้ดี:

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

หากคุณต้องการตรวจสอบเส้นทางอื่นที่ไม่ใช่เส้นทางปัจจุบันคุณสามารถส่งผ่านเข้าไปใน isAdminRoute ()

หมายเหตุวิธีการข้างต้นจะไม่ทำงานสำหรับหน้าแก้ไขโหนดหรือหน้าแก้ไขคำศัพท์ทางภาษีถ้าคุณยกเลิกการเลือก "ใช้ชุดรูปแบบการบริหารเมื่อแก้ไขหรือสร้างเนื้อหา" บนหน้าผู้ดูแลระบบธีมที่ / admin / รูปลักษณ์ จากนั้นคุณต้องตรวจสอบแยกต่างหาก

* คำตอบเดิม: *

ในการทดสอบว่าหน้านั้นเป็นหน้าผู้ดูแลระบบหรือไม่คุณสามารถใช้กระบวนการสองขั้นตอน เนื่องจาก regex สำหรับการแก้ไขโหนดอาจไม่ได้ใช้ธีมผู้ดูแลระบบ

ก่อนอื่นฉันใช้เมธอด isAdminRoute:

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

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

จากนั้นคุณสามารถใช้การตรวจสอบเพิ่มเติมสำหรับเส้นทางเพื่อดูว่าเป็นหน้าแก้ไขโหนดหรือไม่:

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

ต่อไปนี้เป็นวิธีที่ค่อนข้างซับซ้อน แต่วิธีทดสอบหน้าแก้ไขคำที่เกี่ยวข้องกับโหนดและอนุกรมวิธานรวมถึงเส้นทางการดูแลอื่น ๆ :

  $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 เป็นวิธีปฏิบัติที่ไม่ดีและควรหลีกเลี่ยง จนกว่าจะพบวิธีแก้ไขคุณควรตรวจสอบว่าชื่อเส้นทางคือ 'เอนทิตี. โหนด' edit_form '
Eyal

ปัญหาคือ $ route คืนค่าว่างเปล่า ฉันไม่จำเป็นต้องทำ regex ถ้า -> getRouteObject () คืนค่าเส้นทาง
ตกลง

แปลก. คุณได้ลอง\Drupal::routeMatch()->getRouteName()
Eyal

1
\Drupal::routeMatch()->getRouteName()ให้ฉันเป็นโมฆะ (Drupal 8.3.2)
Guillaume Bois

1
การตรวจสอบเพิ่มเติมของคุณไม่มีหน้าผู้ดูแลระบบเช่นการแก้ไขโหนดการลบและการแปล
Philipp Michael

10

ต่อไปนี้เป็นข้อสรุปที่สั้นกว่านี้อีกทั้งยังจับภาพหน้าแก้ไขโหนดเมื่อมีการกำหนดค่าให้ใช้ธีมผู้ดูแลระบบ isAdminRouteวิธีการใช้เส้นทางในปัจจุบันถ้าไม่มีการระบุ:

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

"รวบรวมโหนดแก้ไขหน้าเมื่อพวกเขาถูกกำหนดค่าให้ใช้ชุดรูปแบบผู้ดูแล" เป็นกุญแจสำคัญที่นี่ เหตุผลที่ฉันถามคำถามก็คือเพราะฉันมีปัญหาในการจับภาพหน้าไม่ใช่ชุดรูปแบบผู้ดูแลระบบเช่นโหนดแก้ไขหน้าเมื่อพวกเขาไม่ได้ใช้ชุดรูปแบบผู้ดูแลระบบ
ตกลง

อ่านั่นสมเหตุสมผลแล้ว ใช่มันซับซ้อนกว่าเมื่อไม่ได้ตั้งค่าหน้าแก้ไขโหนดเป็นหน้าผู้ดูแลระบบ
Shaun Dychko
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.