function MediaHooks::fieldWidgetCompleteFormAlter

Implements hook_field_widget_complete_form_alter().

File

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

Class

MediaHooks
Hook implementations for media.

Namespace

Drupal\media\Hook

Code

public function fieldWidgetCompleteFormAlter(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),
        ]);
    }
}

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