function MediaHooks::fieldWidgetCompleteFormAlter

Implements hook_field_widget_complete_form_alter().

Attributes

#[Hook('field_widget_complete_form_alter')]

File

core/modules/media/src/Hook/MediaHooks.php, line 165

Class

MediaHooks
Hook implementations for media.

Namespace

Drupal\media\Hook

Code

public function fieldWidgetCompleteFormAlter(array &$field_widget_complete_form, FormStateInterface $form_state, array $context) : void {
  $elements =& $field_widget_complete_form['widget'];
  // Do not alter the default settings form.
  if ($context['default']) {
    return;
  }
  // Only act on entity reference fields that reference media.
  $field_type = $context['items']->getFieldDefinition()
    ->getType();
  $target_type = $context['items']->getFieldDefinition()
    ->getFieldStorageDefinition()
    ->getSetting('target_type');
  if ($field_type !== 'entity_reference' || $target_type !== 'media') {
    return;
  }
  // Autocomplete widgets need different help text than options widgets.
  $widget_plugin_id = $context['widget']->getPluginId();
  if (in_array($widget_plugin_id, [
    'entity_reference_autocomplete',
    'entity_reference_autocomplete_tags',
  ])) {
    $is_autocomplete = TRUE;
  }
  else {
    // @todo We can't yet properly alter non-autocomplete fields. Resolve this
    //   in https://www.drupal.org/node/2943020 and remove this condition.
    return;
  }
  $elements['#media_help'] = [];
  // Retrieve the media bundle list and add information for the user based on
  // which bundles are available to be created or referenced.
  $settings = $context['items']->getFieldDefinition()
    ->getSetting('handler_settings');
  $allowed_bundles = !empty($settings['target_bundles']) ? $settings['target_bundles'] : [];
  $add_url = _media_get_add_url($allowed_bundles);
  if ($add_url) {
    $elements['#media_help']['#media_add_help'] = $this->t('Create your media on the <a href=":add_page" target="_blank">media add page</a> (opens a new window), then add it by name to the field below.', [
      ':add_page' => $add_url,
    ]);
  }
  $elements['#theme'] = 'media_reference_help';
  // @todo \Drupal\Core\Field\FieldPreprocess::preprocessFieldMultipleValueForm()
  //   assumes this key exists, but it does not exist in the case of a single
  //   widget that accepts multiple values. This is for some reason necessary
  //   to use our template for the entity_autocomplete_tags widget.
  //   Research and resolve this in https://www.drupal.org/node/2943020.
  if (empty($elements['#cardinality_multiple'])) {
    $elements['#cardinality_multiple'] = NULL;
  }
  // Use the title set on the element if it exists, otherwise fall back to the
  // field label.
  $elements['#media_help']['#original_label'] = $elements['#title'] ?? $context['items']->getFieldDefinition()
    ->getLabel();
  // Customize the label for the field widget.
  // @todo Research a better approach https://www.drupal.org/node/2943024.
  $use_existing_label = $this->t('Use existing media');
  if (!empty($elements[0]['target_id']['#title'])) {
    $elements[0]['target_id']['#title'] = $use_existing_label;
  }
  if (!empty($elements['#title'])) {
    $elements['#title'] = $use_existing_label;
  }
  if (!empty($elements['target_id']['#title'])) {
    $elements['target_id']['#title'] = $use_existing_label;
  }
  // This help text is only relevant for autocomplete widgets. When the user
  // is presented with options, they don't need to type anything or know what
  // types of media are allowed.
  if ($is_autocomplete) {
    $elements['#media_help']['#media_list_help'] = $this->t('Type part of the media name.');
    $overview_url = Url::fromRoute('entity.media.collection');
    if ($overview_url->access()) {
      $elements['#media_help']['#media_list_link'] = $this->t('See the <a href=":list_url" target="_blank">media list</a> (opens a new window) to help locate media.', [
        ':list_url' => $overview_url->toString(),
      ]);
    }
    $all_bundles = \Drupal::service('entity_type.bundle.info')->getBundleInfo('media');
    $bundle_labels = array_map(function ($bundle) use ($all_bundles) {
      return $all_bundles[$bundle]['label'];
    }, $allowed_bundles);
    $elements['#media_help']['#allowed_types_help'] = $this->t('Allowed media types: %types', [
      '%types' => implode(", ", $bundle_labels),
    ]);
  }
}

Buggy or inaccurate documentation? Please file an issue. Need support? Need help programming? Connect with the Drupal community.