You are here

UpgradeManager.php in Video Embed Field 8

File

modules/video_embed_media/src/UpgradeManager.php
View source
<?php

namespace Drupal\video_embed_media;

use Drupal\Core\Entity\Query\QueryFactory;
use Drupal\media_entity\Entity\Media;
use Drupal\media_entity\Entity\MediaBundle;
use Drupal\video_embed_media\Plugin\MediaEntity\Type\VideoEmbedField;

/**
 * Upgrades existing media_entity_embedded_video bundles.
 */
class UpgradeManager implements UpgradeManagerInterface {

  /**
   * The entity query factory.
   *
   * @var \Drupal\Core\Entity\Query\QueryFactory
   */
  protected $entityQuery;

  /**
   * UpgradeManager constructor.
   *
   * @param \Drupal\Core\Entity\Query\QueryFactory $entity_query
   *   The entity query service.
   */
  public function __construct(QueryFactory $entity_query) {
    $this->entityQuery = $entity_query;
  }

  /**
   * {@inheritdoc}
   */
  public function upgrade() {
    $entities = $this->entityQuery
      ->get('media_bundle')
      ->condition('type', 'embeddable_video')
      ->execute();
    foreach ($entities as $entity) {
      $bundle = MediaBundle::load($entity);
      $this
        ->upgradeBundle($bundle);
    }
  }

  /**
   * Upgrade a whole bundle to use video_embed_field.
   *
   * @param \Drupal\media_entity\Entity\MediaBundle $bundle
   *   The media bundle object.
   */
  protected function upgradeBundle(MediaBundle $bundle) {

    // Create a video embed field on the media bundle.
    VideoEmbedField::createVideoEmbedField($bundle
      ->id());

    // Load and update all of the existing media entities.
    $media_entities = $this->entityQuery
      ->get('media')
      ->condition('bundle', $bundle
      ->id())
      ->execute();
    foreach ($media_entities as $media_entity) {
      $media_entity = Media::load($media_entity);
      $this
        ->upgradeEntity($media_entity, $bundle
        ->getTypeConfiguration());
    }

    // Update the media bundle type.
    $bundle->type = 'video_embed_field';
    $bundle
      ->save();
  }

  /**
   * Upgrade an individual media entity.
   *
   * @param \Drupal\media_entity\Entity\Media $media_entity
   *   The media entity.
   * @param array $type_configuration
   *   The media type configuration.
   */
  protected function upgradeEntity(Media $media_entity, $type_configuration) {

    // Copy the existing media bundle field value to the new field value.
    $existing_url_field = $media_entity->{$type_configuration['source_field']}
      ->getValue();
    $existing_url = isset($existing_url_field[0]['uri']) ? $existing_url_field[0]['uri'] : $existing_url_field[0]['value'];
    $media_entity->{VideoEmbedField::VIDEO_EMBED_FIELD_DEFAULT_NAME} = [
      [
        'value' => $existing_url,
      ],
    ];
    $media_entity
      ->save();
  }

}

Classes

Namesort descending Description
UpgradeManager Upgrades existing media_entity_embedded_video bundles.