Dacă un utilizator nu are permisiunea de administrator pentru un tip de entitate, aceasta nu înseamnă că nu puteți permite operațiuni specifice asupra anumitor entități existente.
De exemplu, editorii de conținut cărora le-ați dat permisiunea de a administra conținut pot, de asemenea, să actualizeze blocuri ale pluginului dvs. de blocare personalizat:
utilizați Drupal\block\Entity\Block;
utilizați Drupal\Core\Access\AccessResult;
utilizați Drupal\Core\Session\AccountInterface;
/**
* Implementează hook_ENTITY_TYPE_access() pentru tipul de entitate „block”.
*/
function mymodule_block_access(Blocați $bloc, $operațiune, AccountInterface $cont) {
if ($operation == 'actualizare'
&& $block->getPluginId() == 'custom_block_plugin_id'
// Ultima condiție este necesară doar dacă trucul de jos este folosit cu
// `$block_entity->createDuplicate()->access('update')`.
&& $block->id() !== NULL
) {
returnează AccessResult::allowedIfHasPermission($cont, 'administer nodes');
}
returnează AccessResult::neutral();
}
De asemenea, trebuie să modificați formularul pentru a nu redirecționa la trimiterea către o pagină la care utilizatorul nu are acces. Sau trimiteți la formularul de editare cu un șir de interogare de destinație care indică către o altă pagină.
(EDIT de @donquixote)
Dacă doriți să restricționați accesul la alte elemente din pagină, o puteți face ca mai jos.
Acesta este un pic fragil, deoarece presupune o structură foarte specifică a formei.
/**
* Implementează hook_form_FORM_ID_alter() pentru „block_form”.
*/
funcția mymodule_form_block_form_alter(array &$form, FormStateInterface $form_state, șir $form_id) {
$form_object = $form_state->getFormObject();
dacă (!$form_object instanță de BlockForm) {
întoarcere;
}
/** @var Block $block_entity */
$block_entity = $form_object->getEntity();
if ($block_entity->getPluginId() !== 'custom_block_plugin_id') {
întoarcere;
}
if ($block_entity->createDuplicate()->access('actualizare')) {
// Utilizatorul are acces general pentru a actualiza acest bloc.
întoarcere;
}
// Utilizatorului i sa dat acces numai prin mymodule_block_access().
// Aceștia ar trebui să editeze doar setările specifice pluginului, nu să schimbe locul
// blocul este plasat.
foreach (['vizibility', 'id', 'weight', 'region'] as $key) {
if (isset($form[$key])) {
$form[$key]['#access'] = FALSE;
}
}
foreach (['label', 'label_display'] ca $key) {
if (isset($form['settings'][$key])) {
$form['settings'][$key]['#access'] = FALSE;
}
}
foreach (['șterge'] ca $key) {
if (isset($form['actions'][$key])) {
$form['actions'][$key]['#access'] = FALSE;
}
}
}