ฉันกำลังพยายามจำกัดการเข้าถึงสำหรับผู้ใช้ที่ไม่ใช่ผู้ดูแลระบบในผู้ดูแลระบบ/โครงสร้าง/เมนู เพื่อให้ผู้ดูแลระบบเท่านั้นที่สามารถสร้างลิงก์ใหม่ผ่านทางผู้ดูแลระบบ/โครงสร้าง/เมนู
ตอนนี้ฉันต้องการให้เมนูพิเศษที่มีรหัส "โฟกัส" ปุ่ม "เพิ่มลิงก์" พร้อมใช้งานสำหรับบทบาทอื่นด้วย
นี่คือภาพหน้าจอของแบ็กเอนด์จริงโดยที่ "เพิ่มลิงก์" ยังใช้งานได้ ฉันต้องการให้สิ่งนี้หายไปสำหรับ Hauptnavigation แต่ไม่ใช่สำหรับ Fokusnavigation
สิ่งเดียวกันเมื่อคุณคลิกที่เมนู คุณได้รับปุ่ม "เพิ่มลิงค์" ฉันสามารถปิดใช้งานสิ่งนี้ด้วยรหัสด้านล่าง แต่ฉันไม่ทราบวิธีอนุญาตสำหรับบทบาทที่ไม่ใช่ผู้ดูแลระบบอีกครั้ง
ฉันสามารถรับ menu->id() ในไฟล์ my_menu.module ด้วยรหัสเดียวกันกับใน routesubscriber ด้านล่าง แต่อย่างใดมันไม่ทำงานใน routesubscriber
Drush CR ส่งคืนค่า an
ข้อผิดพลาดร้ายแรงของ PHP: ข้อผิดพลาดที่ไม่ได้ตรวจสอบ: การเรียกไปยังฟังก์ชันสมาชิก id() เป็นโมฆะใน /var/www/html/web/modules/custom/my_menu/src/Routing/RouteSubscriber.php:31
การติดตามสแต็ก:
#0 /var/www/html/web/core/lib/Drupal/Core/Routing/RouteSubscriberBase.php(37): Drupal\my_menu\Routing\RouteSubscriber->alterRoutes(Object(Symfony\Component\Routing\RouteCollection))
#1 [ฟังก์ชันภายใน]: Drupal\Core\Routing\RouteSubscriberBase->onAlterRoutes(Object(Drupal\Core\Routing\RouteBuildEvent), 'routing.route_a...', Object(Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher))
#2 /var/www/html/web/core/lib/Drupal/Component/EventDispatcher/ContainerAwareEventDispatcher.php(142): call_user_func(Array, Object(Drupal\Core\Routing\RouteBuildEvent), 'routing.route_a... ', วัตถุ (Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher))
#3 /var/www/html/web/core/lib/Drupal/Core/Routing/RouteBuilder.php(189): Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object(Drupal\Core\Routing\RouteBuildEvent), 'routing.route_a...')
ใน /var/www/html/web/modules/custom/my_menu/src/Routing/RouteSubscriber.php ในบรรทัดที่ 31
มีวิธีอื่นในการรับค่าหรือไม่? ผมทำอะไรผิดหรือเปล่า.
นี่คือรหัสของฉัน
<?php
เนมสเปซ Drupal\my_menu\Routing;
ใช้ Drupal\Core\Routing\RouteSubscriberBase;
ใช้ Drupal\Core\Routing\RoutingEvents;
ใช้ Symfony\Component\Routing\RouteCollection;
ใช้ Drupal\Core\Routing\RouteMatchInterface;
/**
* คลาส RouteSubscriber
*
* ซ่อนองค์ประกอบการแก้ไขเมนูสำหรับผู้ที่ไม่ใช่ผู้ดูแลระบบ
*
* @package Drupal\hw_menu\Routing
*/
คลาส RouteSubscriber ขยาย RouteSubscriberBase {
/**
* {@inheritdoc}
*/
ฟังก์ชั่นสาธารณะ alterRoutes (RouteCollection $collection) {
ถ้า ($route = $collection->get('entity.menu.add_link_form')) {
// dpm($route->getRequirements());
ตัวอย่าง $menu \Drupal\system\Entity\Menu;
$menu = \Drupal::routeMatch()->getParameter('เมนู');
if($menu->id() != 'โฟกัส') {
$route->setRequirement('_role', 'administrator');
}
// dpm($route->getRequirements());
}
}
/**
* {@inheritdoc}
*/
ฟังก์ชั่นคงที่สาธารณะ getSubscribedEvents () {
// เรียกใช้หลังจาก content_translation ซึ่งมีลำดับความสำคัญ -210
$events[RoutingEvents::ALTER] = ['onAlterRoutes', -230];
ส่งคืนเหตุการณ์ $;
}
}