Same name and namespace in other branches
  1. 9 core/modules/media/media.module \media_field_widget_complete_form_alter()

Implements hook_field_widget_complete_form_alter().

File

core/modules/media/media.module, line 222
Provides media items.

Code

function media_field_widget_complete_form_alter(array &$field_widget_complete_form, FormStateInterface $form_state, array $context) {
  $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'] = 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 template_preprocess_field_multiple_value_form() 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 = 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'] = t('Type part of the media name.');
    $overview_url = Url::fromRoute('entity.media.collection');
    if ($overview_url
      ->access()) {
      $elements['#media_help']['#media_list_link'] = 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'] = t('Allowed media types: %types', [
      '%types' => implode(", ", $bundle_labels),
    ]);
  }
}