diff --git a/src/Plugin/entity_embed/EntityEmbedDisplay/ViewModeFieldFormatter.php b/src/Plugin/entity_embed/EntityEmbedDisplay/ViewModeFieldFormatter.php index b69dae8..1d931b0 100644 --- a/src/Plugin/entity_embed/EntityEmbedDisplay/ViewModeFieldFormatter.php +++ b/src/Plugin/entity_embed/EntityEmbedDisplay/ViewModeFieldFormatter.php @@ -3,6 +3,8 @@ namespace Drupal\entity_embed\Plugin\entity_embed\EntityEmbedDisplay; use Drupal\Core\Form\FormStateInterface; +use Drupal\Core\Entity\EntityInterface; +use Drupal\media\Plugin\media\Source\Image; /** * Entity Embed Display reusing entity reference field formatters. @@ -48,8 +50,91 @@ class ViewModeFieldFormatter extends EntityReferenceFieldFormatter { * {@inheritdoc} */ public function buildConfigurationForm(array $form, FormStateInterface $form_state) { - // Configuration form is not needed as the view mode is defined implicitly. - return []; + $form = []; + $entity = $this->getEntityFromContext(); + + if ($image_field = $this->hasImageField($entity)) { + + $settings = $entity->{field_image}->getItemDefinition()->getSettings(); + + if (!empty($settings['alt_field'])) { + $form['field_image_alt'] = [ + '#title' => $this->t('Alt text'), + '#type' => 'textfield', + '#default_value' => $entity->{$image_field}->alt ? $entity->{$image_field}->alt : '', + '#required' => $settings['alt_field_required'], + ]; + } + + if (!empty($settings['title_field'])) { + $form['field_image_title'] = [ + '#title' => $this->t('Title'), + '#type' => 'textfield', + '#default_value' => $entity->{$image_field}->title ? $entity->{$image_field}->title : '', + '#required' => $settings['title_field_required'], + ]; + } + } + + return $form; + } + + /** + * {@inheritdoc} + */ + public function submitConfigurationForm(array &$form, FormStateInterface $form_state) { + $entity = $this->getEntityFromContext(); + + if ($image_field = $this->hasImageField($entity)) { + + $values = $form_state->getValue(['attributes', 'data-entity-embed-display-settings']); + + $settings = $entity->{field_image}->getItemDefinition()->getSettings(); + + if (!empty($settings['alt_field'])) { + $entity->{$image_field}->alt = $values['field_image_alt']; + unset($values['field_image_alt']); + } + + if (!empty($settings['field_field'])) { + $entity->{$image_field}->title = $values['field_image_title']; + unset($values['field_image_title']); + } + + if (!empty($values)) { + $form_state->setValue(['attributes', 'data-entity-embed-display-settings'], $values); + } + else { + $form_state->unsetValue(['attributes', 'data-entity-embed-display-settings']); + } + } + } + + /** + * Get image field from config. + * + * @param \Drupal\Core\Entity\EntityInterface $entity + * Embedded entity. + * + * @return string|null + * String of image field name. + */ + protected function hasImageField(EntityInterface $entity) { + if ($entity->getEntityTypeId() != 'media') { + return NULL; + } + + if (!$entity->getSource() instanceof Image) { + return NULL; + } + + $config = $entity->getSource()->getConfiguration(); + + if (!empty($config['source_field'])) { + return $config['source_field']; + } + + return NULL; } /**