acquia_dam-1.0.0-rc1/src/Form/FocalPointMediaEditFormAlter.php
src/Form/FocalPointMediaEditFormAlter.php
<?php namespace Drupal\acquia_dam\Form; use Drupal\acquia_dam\ImageStyleHelper; use Drupal\Core\DependencyInjection\ContainerInjectionInterface; use Drupal\Core\Entity\EntityTypeManagerInterface; use Drupal\Core\Form\FormStateInterface; use Drupal\Core\StringTranslation\StringTranslationTrait; use Drupal\image\Entity\ImageStyle; use Symfony\Component\DependencyInjection\ContainerInterface; /** * Alters the media edit form to add focal point element on DAM images. */ final class FocalPointMediaEditFormAlter implements ContainerInjectionInterface { use StringTranslationTrait; /** * Entity type manager service. * * @var \Drupal\Core\Entity\EntityTypeManagerInterface */ protected $entityTypeManager; /** * Acquia DAM image helper service. * * @var \Drupal\acquia_dam\ImageStyleHelper */ protected $imageStyleHelper; /** * Constructs a new FocalPointMediaEditFormAlter object. * * @param \Drupal\Core\Entity\EntityTypeManagerInterface $entity_type_manager * Entity type manager. * @param \Drupal\acquia_dam\ImageStyleHelper $image_style_helper * Acquia DAM image helper service. */ public function __construct(EntityTypeManagerInterface $entity_type_manager, ImageStyleHelper $image_style_helper) { $this->entityTypeManager = $entity_type_manager; $this->imageStyleHelper = $image_style_helper; } /** * {@inheritdoc} */ public static function create(ContainerInterface $container) { $instance = new self( $container->get('entity_type.manager'), $container->get('acquia_dam.image_style_support') ); $instance->setStringTranslation($container->get('string_translation')); return $instance; } /** * Alters the media edit form to add focal point element. * * @param array $form * The form. * @param \Drupal\Core\Form\FormStateInterface $form_state * The form state. * * @throws \Drupal\Component\Plugin\Exception\InvalidPluginDefinitionException * @throws \Drupal\Component\Plugin\Exception\PluginNotFoundException */ public function formAlter(array &$form, FormStateInterface $form_state): void { $media = $form_state->getFormObject()->getEntity(); /** @var \Drupal\crop\CropInterface $crop */ if ($crops = $this->imageStyleHelper->getCrops($media)) { $image_styles = []; foreach ($crops as $crop) { $position = $crop->position(); $image_properties = $media->getSource()->getMetadata($media, 'image_properties'); $thumbnail_uri = $media->getSource()->getMetadata($media, 'thumbnail_uri'); $relative_position = $this ->imageStyleHelper ->absoluteToRelative( $position['x'], $position['y'], $image_properties['width'], $image_properties['height'] ); $uri = $crop->get('uri')->first()->getValue(); preg_match('/styles\/([\w]*)/', $uri['value'], $image_style_matches); if (!isset($image_style_matches[1])) { return; } $image_style_id = $image_style_matches[1]; $image_style = ImageStyle::load($image_style_id); if (!$image_style) { return; } $form[$image_style_id] = [ '#type' => 'acquia_dam_focal_point', '#tree' => TRUE, '#title' => $this->t('Focal point selection for image style: @label', ['@label' => $image_style->label()]), '#description' => $this->t('Select the point you would like to crop your media from.'), '#description_display' => 'before', '#position' => $relative_position['x'] . ',' . $relative_position['y'], '#thumbnail_uri' => $thumbnail_uri, '#style_name' => 'media_library', ]; $image_styles[$crop->id()] = $image_style_id; } $form_state->set('image_styles', $image_styles); $form['actions']['submit']['#submit'][] = [self::class, 'updateCrop']; } } /** * Alters the media edit form submit. * * @param array $form * The form. * @param \Drupal\Core\Form\FormStateInterface $form_state * The form state. * * @throws \Drupal\Component\Plugin\Exception\PluginNotFoundException * @throws \Drupal\Core\Entity\EntityStorageException * @throws \Drupal\Component\Plugin\Exception\InvalidPluginDefinitionException */ public static function updateCrop(array &$form, FormStateInterface $form_state): void { $storage = $form_state->getStorage(); $media = $form_state->getFormObject()->getEntity(); /** @var \Drupal\acquia_dam\ImageStyleHelper $image_style_helper */ $image_style_helper = \Drupal::service('acquia_dam.image_style_support'); $values = $form_state->getValues(); foreach ($storage['image_styles'] as $crop_id => $image_style_id) { if ($new_absolute_position = $values[$image_style_id]['focal_point']) { [$x, $y] = explode(',', $new_absolute_position, 2); $image_style_helper->updateCrop($x, $y, $media, $crop_id); } } } }