Если у пользователя нет прав администратора для типа объекта, это не означает, что вы не можете разрешить определенные операции с конкретными существующими объектами.
Например, редакторы контента, которым вы предоставили разрешение на администрирование контента, также могут обновлять блоки вашего плагина настраиваемых блоков:
используйте Drupal\block\Entity\Block;
используйте Drupal\Core\Access\AccessResult;
используйте Drupal\Core\Session\AccountInterface;
/**
* Реализует hook_ENTITY_TYPE_access() для типа объекта "блок".
*/
функция mymodule_block_access (блок $ блок, $ операция, учетная запись $ AccountInterface) {
если ($operation == 'обновить'
&& $block->getPluginId() == 'custom_block_plugin_id'
// Последнее условие необходимо только в том случае, если трюк снизу используется с
// `$block_entity->createDuplicate()->access('update')`.
&& $block->id() !== NULL
) {
return AccessResult::allowedIfHasPermission($account, 'администрировать узлы');
}
вернуть AccessResult::neutral();
}
Вам также необходимо изменить форму, чтобы она не перенаправляла при отправке на страницу, к которой у пользователя нет доступа. Или свяжите форму редактирования с целевой строкой запроса, указывающей на другую страницу.
(РЕДАКТИРОВАТЬ @donquixote)
Если вы хотите ограничить доступ к другим элементам на странице, вы можете сделать это, как показано ниже.
Это немного хрупко, потому что предполагает очень специфическую структуру формы.
/**
* Реализует hook_form_FORM_ID_alter() для 'block_form'.
*/
function mymodule_form_block_form_alter (массив и $ форма, FormStateInterface $ form_state, строка $ form_id) {
$form_object = $form_state->getFormObject();
если (!$form_object instanceof BlockForm) {
возвращаться;
}
/** @var Блок $block_entity */
$block_entity = $form_object->getEntity();
если ($block_entity->getPluginId() !== 'custom_block_plugin_id') {
возвращаться;
}
если ($block_entity->createDuplicate()->доступ('обновление')) {
// Пользователь имеет общий доступ для обновления этого блока.
возвращаться;
}
// Пользователю был предоставлен доступ только через mymodule_block_access().
// Они должны редактировать только определенные настройки плагина, а не менять, где
// блок размещен.
foreach (['видимость', 'id', 'вес', 'регион'] как $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;
}
}
}