You are here

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 = [];
  }
}