acquia_dam-1.0.0-rc1/src/Controller/MetadataSyncController.php

src/Controller/MetadataSyncController.php
<?php

declare(strict_types=1);

namespace Drupal\acquia_dam\Controller;

use Drupal\acquia_dam\Entity\MediaSourceField;
use Drupal\acquia_dam\Plugin\Field\FieldType\AssetItem;
use Drupal\acquia_dam\Plugin\media\Source\Asset;
use Drupal\Core\Cache\CacheTagsInvalidatorInterface;
use Drupal\Core\DependencyInjection\ContainerInjectionInterface;
use Drupal\Core\Messenger\MessengerInterface;
use Drupal\Core\StringTranslation\StringTranslationTrait;
use Drupal\Core\StringTranslation\TranslationInterface;
use Drupal\media\MediaInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;

/**
 * Controller to sync metadata from DAM to media entity.
 */
final class MetadataSyncController implements ContainerInjectionInterface {

  use StringTranslationTrait;

  /**
   * The cache tag invalidator.
   *
   * @var \Drupal\Core\Cache\CacheTagsInvalidatorInterface
   */
  private $cacheTagsInvalidator;

  /**
   * The messenger.
   *
   * @var \Drupal\Core\Messenger\MessengerInterface
   */
  private $messenger;

  /**
   * Constructs a new MetadataSyncController object.
   *
   * @param \Drupal\Core\Cache\CacheTagsInvalidatorInterface $cache_tags_invalidator
   *   The cache tag invalidator.
   * @param \Drupal\Core\Messenger\MessengerInterface $messenger
   *   The messenger.
   * @param \Drupal\Core\StringTranslation\TranslationInterface $translation
   *   The translation service.
   */
  public function __construct(CacheTagsInvalidatorInterface $cache_tags_invalidator, MessengerInterface $messenger, TranslationInterface $translation) {
    $this->cacheTagsInvalidator = $cache_tags_invalidator;
    $this->messenger = $messenger;
    $this->stringTranslation = $translation;
  }

  /**
   * {@inheritdoc}
   */
  public static function create(ContainerInterface $container) {
    return new self(
      $container->get('cache_tags.invalidator'),
      $container->get('messenger'),
      $container->get('string_translation')
    );
  }

  /**
   * Syncs metadata from DAM to the asset.
   *
   * @param \Drupal\media\MediaInterface $media
   *   The media entity.
   *
   * @return \Symfony\Component\HttpFoundation\RedirectResponse
   *   The response.
   */
  public function syncMetadata(MediaInterface $media): RedirectResponse {
    if (!$media->getSource() instanceof Asset) {
      throw new NotFoundHttpException('Media is not an Acquia DAM asset.');
    }
    $source_field = $media->get(MediaSourceField::SOURCE_FIELD_NAME);
    $source_field_item = $source_field->first();
    assert($source_field_item instanceof AssetItem);
    $this->cacheTagsInvalidator->invalidateTags(["acquia-dam-asset:$source_field_item->asset_id"]);
    // Calling `save` causes the MediaStorage to invoke `Media::prepareSave`
    // which syncs the metadata.
    $media->save();
    $this->messenger->addMessage($this->t('New metadata has been synced for @label. Existing values have not been changed.', [
      '@label' => $media->label(),
    ]));
    return new RedirectResponse($media->toUrl('collection')->toString());
  }

}

Главная | Обратная связь

drupal hosting | друпал хостинг | it patrol .inc