หากผู้ใช้ไม่มีสิทธิ์ระดับผู้ดูแลระบบสำหรับประเภทเอนทิตี ไม่ได้หมายความว่าคุณไม่สามารถอนุญาตการดำเนินการบางอย่างกับเอนทิตีที่มีอยู่เฉพาะได้
ตัวอย่างเช่น โปรแกรมแก้ไขเนื้อหาที่คุณให้สิทธิ์ในการจัดการเนื้อหายังได้รับอนุญาตให้อัปเดตบล็อกของปลั๊กอินบล็อกที่กำหนดเองของคุณ:
ใช้ Drupal\block\Entity\Block;
ใช้ Drupal\Core\Access\AccessResult;
ใช้ Drupal\Core\Session\AccountInterface;
/**
* ใช้ hook_ENTITY_TYPE_access() สำหรับเอนทิตีประเภท "บล็อก"
*/
ฟังก์ชัน mymodule_block_access (บล็อก $block, $operation, AccountInterface $account) {
ถ้า ($operation == 'อัปเดต'
&& $block->getPluginId() == 'กำหนดเอง_block_plugin_id'
// เงื่อนไขสุดท้ายจำเป็นก็ต่อเมื่อใช้เคล็ดลับจากด้านล่างกับ
// `$block_entity->createDuplicate()->การเข้าถึง('update')`
&& $block->id() !== NULL
) {
ส่งคืน AccessResult::allowedIfHasPermission($account, 'administer nodes');
}
กลับ AccessResult::เป็นกลาง ();
}
คุณต้องแก้ไขแบบฟอร์มไม่ให้เปลี่ยนเส้นทางเมื่อส่งไปยังหน้าที่ผู้ใช้ไม่มีสิทธิ์เข้าถึง หรือลิงก์ไปยังแบบฟอร์มแก้ไขด้วยสตริงข้อความค้นหาปลายทางที่ชี้ไปยังหน้าอื่น
(แก้ไขโดย @donquixote)
หากคุณต้องการจำกัดการเข้าถึงองค์ประกอบอื่นๆ บนเพจ คุณสามารถทำได้ดังนี้
สิ่งนี้ค่อนข้างเปราะบางเล็กน้อย เนื่องจากถือว่ามีโครงสร้างเฉพาะของแบบฟอร์ม
/**
* ใช้ hook_form_FORM_ID_alter() สำหรับ 'block_form'
*/
ฟังก์ชัน mymodule_form_block_form_alter (อาร์เรย์ &$form, FormStateInterface $form_state, สตริง $form_id) {
$form_object = $form_state->getFormObject();
ถ้า (!$form_object อินสแตนซ์ของ BlockForm) {
กลับ;
}
/** @var บล็อก $block_entity */
$block_entity = $form_object->getEntity();
ถ้า ($block_entity->getPluginId() !== 'custom_block_plugin_id') {
กลับ;
}
ถ้า ($block_entity->createDuplicate()->การเข้าถึง('อัปเดต')) {
// ผู้ใช้มีสิทธิ์ทั่วไปในการอัปเดตบล็อคนี้
กลับ;
}
// ผู้ใช้ได้รับสิทธิ์เข้าถึงผ่าน mymodule_block_access() เท่านั้น
// พวกเขาควรแก้ไขการตั้งค่าปลั๊กอินเฉพาะเท่านั้น ไม่เปลี่ยนตำแหน่ง
// วางบล็อกแล้ว
foreach (['visibility', 'id', 'weight', 'region'] เป็น $key) {
ถ้า (isset($form[$key])) {
$form[$key]['#access'] = FALSE;
}
}
foreach (['label', 'label_display'] เป็น $key) {
ถ้า (isset($form['settings'][$key])) {
$form['settings'][$key]['#access'] = FALSE;
}
}
foreach (['ลบ'] เป็น $key) {
ถ้า (isset($form['actions'][$key])) {
$form['actions'][$key]['#access'] = FALSE;
}
}
}