Nếu người dùng không có quyền quản trị đối với một loại thực thể, điều này không có nghĩa là bạn không thể cho phép các hoạt động cụ thể trên các thực thể cụ thể hiện có.
Ví dụ: trình chỉnh sửa nội dung mà bạn đã cấp quyền quản lý nội dung cũng được phép cập nhật các khối của plugin khối tùy chỉnh của bạn:
sử dụng Drupal\block\Entity\Block;
sử dụng Drupal\Core\Access\AccessResult;
sử dụng Drupal\Core\Session\AccountInterface;
/**
* Triển khai hook_ENTITY_TYPE_access() cho loại thực thể "khối".
*/
function mymodule_block_access(Khối $block, $operation, AccountInterface $account) {
nếu ($hoạt động == 'cập nhật'
&& $block->getPluginId() == 'custom_block_plugin_id'
// Điều kiện cuối cùng chỉ cần thiết nếu thủ thuật bên dưới được sử dụng với
// `$block_entity->createDuplicate()->access('update')`.
&& $block->id() !== NULL
) {
trả lại AccessResult::allowedIfHasPermission($account, 'quản lý các nút');
}
trả về AccessResult::neutral();
}
Bạn cũng cần thay đổi biểu mẫu để không chuyển hướng khi gửi tới trang mà người dùng không có quyền truy cập. Hoặc liên kết đến biểu mẫu chỉnh sửa bằng chuỗi truy vấn đích trỏ đến một trang khác.
(CHỈNH SỬA bởi @donquixote)
Nếu bạn muốn hạn chế quyền truy cập vào các thành phần khác trên trang, bạn có thể thực hiện như bên dưới.
Đây là một chút mong manh, bởi vì nó giả định một cấu trúc rất cụ thể của hình thức.
/**
* Triển khai hook_form_FORM_ID_alter() cho 'block_form'.
*/
function mymodule_form_block_form_alter(mảng &$form, FormStateInterface $form_state, chuỗi $form_id) {
$form_object = $form_state->getFormObject();
if (!$form_object instanceof BlockForm) {
trở lại;
}
/** @var Khối $block_entity */
$block_entity = $form_object->getEntity();
if ($block_entity->getPluginId() !== 'custom_block_plugin_id') {
trở lại;
}
if ($block_entity->createDuplicate()->access('update')) {
// Người dùng có quyền truy cập chung để cập nhật khối này.
trở lại;
}
// Người dùng chỉ được cấp quyền truy cập qua mymodule_block_access().
// Họ chỉ nên chỉnh sửa cài đặt plugin cụ thể, không thay đổi vị trí của plugin
// khối được đặt.
foreach (['visibility', 'id', 'weight', 'region'] as $key) {
if (isset($form[$key])) {
$form[$key]['#access'] = FALSE;
}
}
foreach (['nhãn', 'nhãn_hiển thị'] là $key) {
if (isset($form['settings'][$key])) {
$form['settings'][$key]['#access'] = FALSE;
}
}
foreach (['xóa'] dưới dạng khóa $) {
if (isset($form['actions'][$key])) {
$form['actions'][$key]['#access'] = FALSE;
}
}
}