function menu_admin_per_menu_field_widget_multivalue_form_alter in Menu Admin per Menu 8
Implements hook_field_widget_multivalue_form_alter().
Check for a menu entity reference field. When the default value is a menu the current user doesn't have access to, hide the field.
See also
\Drupal\menu_admin_per_menu\Plugin\EntityReferenceSelection\MenuSelection
File
- ./
menu_admin_per_menu.module, line 126 - Module file for menu_admin_per_menu.
Code
function menu_admin_per_menu_field_widget_multivalue_form_alter(&$elements, FormStateInterface $form_state, array $context) {
$account = \Drupal::currentUser();
if ($account
->hasPermission('administer menu')) {
return;
}
/** @var \Drupal\field\FieldStorageConfigInterface $field_storage_config */
$field_storage_config = $context['items']
->getFieldDefinition()
->getFieldStorageDefinition();
if ($field_storage_config
->getType() !== 'entity_reference' || $field_storage_config
->getSetting('target_type') !== 'menu') {
return;
}
if ($context['items']
->isEmpty()) {
return;
}
$access = TRUE;
/** @var \Drupal\menu_admin_per_menu\MenuAdminPerMenuAccessInterface $allowedMenusService */
$allowedMenusService = \Drupal::service('menu_admin_per_menu.allowed_menus');
$allowed_menus = $allowedMenusService
->getPerMenuPermissions($account);
foreach ($context['items'] as $field_value) {
if (!in_array($field_value->target_id, $allowed_menus, TRUE)) {
$access = FALSE;
}
}
// Hide the entity reference field from the frontend. When #access was used,
// This also resetted the entity reference field value.
if ($access === FALSE) {
$elements = [];
}
}