acquia_dam-1.0.0-rc1/src/Form/MediaEmbedFormAlter.php
src/Form/MediaEmbedFormAlter.php
<?php declare(strict_types=1); namespace Drupal\acquia_dam\Form; use Drupal\acquia_dam\EmbedCodeFactory; use Drupal\acquia_dam\Plugin\media\Source\Asset; use Drupal\Core\DependencyInjection\ContainerInjectionInterface; use Drupal\Core\Entity\EntityRepositoryInterface; use Drupal\Core\Form\FormStateInterface; use Drupal\media\MediaInterface; use Symfony\Component\DependencyInjection\ContainerInterface; /** * Alters the media embed form to add support for embed codes. * * @see \Drupal\media\Form\EditorMediaDialog::buildForm * @link https://www.drupal.org/docs/core-modules-and-themes/core-modules/media-library-module/embedding-media-with-ckeditor#s-customizing-the-edit-embedded-media-form */ final class MediaEmbedFormAlter implements ContainerInjectionInterface { /** * The entity repository. * * @var \Drupal\Core\Entity\EntityRepositoryInterface */ private $entityRepository; /** * Constructs a new MediaEmbedFormAlter object. * * @param \Drupal\Core\Entity\EntityRepositoryInterface $entity_repository * The entity repository. */ public function __construct(EntityRepositoryInterface $entity_repository) { $this->entityRepository = $entity_repository; } /** * {@inheritdoc} */ public static function create(ContainerInterface $container): self { return new self($container->get('entity.repository')); } /** * Alters the media embed form to add embed code selection. * * @param array $form * The form. * @param \Drupal\Core\Form\FormStateInterface $form_state * The form state. * * @throws \Drupal\Core\Entity\EntityStorageException */ public function formAlter(array &$form, FormStateInterface $form_state): void { if (isset($form_state->getUserInput()['editor_object'])) { $editor_object = $form_state->getUserInput()['editor_object']; $media_embed_element = $editor_object['attributes']; } else { $media_embed_element = $form_state->get('media_embed_element'); } // Something went wrong, bail out. if (!is_array($media_embed_element) || empty($media_embed_element['data-entity-uuid'])) { return; } $media = $this->entityRepository->loadEntityByUuid('media', $media_embed_element['data-entity-uuid']); // Something went _really_ wrong and the media entity could not be loaded. if (!$media instanceof MediaInterface) { return; } if (!$media->getSource() instanceof Asset) { return; } /** @var \Drupal\acquia_dam\Plugin\media\Source\Asset $asset */ $asset = $media->getSource(); $form['data-embed-code-id'] = [ '#title' => t('Embed code'), '#type' => 'select', '#options' => EmbedCodeFactory::getSelectOptions($asset->getDerivativeId()), '#default_value' => $media_embed_element['data-embed-code-id'] ?? 'original', // Setting the parent to `attributes` ensures the embed form saves our // custom attribute properly. '#parents' => ['attributes', 'data-embed-code-id'], ]; } }