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\HookCode
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'] = 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.