Commit 35cd13f7 authored by Yash Rode's avatar Yash Rode Committed by Zoltan Attila Horvath
Browse files

Issue #3272705 by yash.rode: Migrate Youtube Field from D7 to D9

parent 43511f5a
Loading
Loading
Loading
Loading
+19 −0
Original line number Diff line number Diff line
id: d7_youtube_field
label: Youtube Field migration
migration_tags:
  - Drupal 7
  - Content
idMap:
  plugin: smart_sql
source:
  plugin: youtube
  constants:
    bundle: remote_video
process:
  bundle: 'constants/bundle'
  field_media_oembed_video/value:
    plugin: media_internet_field_value
    source: input
  name: '@field_media_oembed_video/value'
destination:
  plugin: entity:media
+78 −0
Original line number Diff line number Diff line
<?php

namespace Drupal\media_migration\Plugin\migrate\field;

use Drupal\migrate\Plugin\MigrationInterface;
use Drupal\migrate_drupal\Plugin\migrate\field\FieldPluginBase;

/**
 * Field migration plugin for Drupal 7 Youtube fields.
 *
 * @MigrateField(
 *   id = "youtube",
 *   core = {7},
 *   type_map = {
 *    "youtube" = "entity_reference"
 *   },
 *   source_module = "youtube",
 *   destination_module = "media"
 * )
 */
class Youtube extends FieldPluginBase {

  /**
   * {@inheritdoc}
   */
  public function getFieldFormatterMap() {
    return [
      'youtube_video' => 'entity_reference_entity_view',
      'youtube_thumbnail' => 'media_thumbnail',
      'youtube_url' => 'entity_reference_label',
    ];
  }

  /**
   * {@inheritdoc}
   */
  public function getFieldWidgetMap() {
    return [
      'youtube' => 'media_library_widget',
    ];
  }

  /**
   * {@inheritdoc}
   */
  public function alterFieldMigration(MigrationInterface $migration) {
    $settings = [
      'youtube' => [
        'plugin' => 'media_image_field_settings',
        'expected_source_type' => 'youtube',
      ],
    ];
    $migration->mergeProcessOfProperty('settings', $settings);

    parent::alterFieldMigration($migration);
  }

  /**
   * {@inheritdoc}
   */
  public function defineValueProcessPipeline(MigrationInterface $migration, $field_name, $data) {
    $migration->setProcessOfProperty(
      $field_name,
      [
        'plugin' => 'sub_process',
        'source' => $field_name,
        'process' => [
          'target_id' => [
            'plugin' => 'migration_lookup',
            'migration' => 'd7_youtube_field',
            'source' => 'input',
          ],
        ],
      ]
    );
  }

}
+3 −1
Original line number Diff line number Diff line
@@ -19,7 +19,9 @@ class MediaImageFieldSettings extends ProcessPluginBase {
   * {@inheritdoc}
   */
  public function transform($value, MigrateExecutableInterface $migrate_executable, Row $row, $destination_property) {
    if ($row->getSourceProperty('type') == 'media_image') {
    $source_type = $this->configuration['expected_source_type'] ?? 'media_image';

    if ($row->getSourceProperty('type') == $source_type) {
      $value['target_type'] = 'media';
    }
    return $value;
+5 −3
Original line number Diff line number Diff line
@@ -21,16 +21,18 @@ class MediaInternetFieldValue extends ProcessPluginBase {
   */
  public function transform($value, MigrateExecutableInterface $migrate_executable, Row $row, $destination_property) {
    // We're operating with the source values.
    $source_values = $row->getSource();
    $source_value = $row->getSourceProperty('uri') ?? $value;
    $replaced = preg_replace([
      '/^youtube:\/\/v\//i',
      '/^vimeo:\/\/v\//i',
      '/^https:\/\/www\.youtube\.com\/watch\?v=(.{11}).*/',
    ], [
      'https://www.youtube.com/watch?v=',
      'https://vimeo.com/',
    ], $source_values['uri']);
      'https://www.youtube.com/watch?v=$1',
    ], $value);

    if ($replaced !== $source_values['uri']) {
    if ($replaced !== $source_value) {
      return $replaced;
    }

+90 −0
Original line number Diff line number Diff line
<?php

namespace Drupal\media_migration\Plugin\migrate\source;

use Drupal\Core\Database\Query\SelectInterface;
use Drupal\migrate_drupal\Plugin\migrate\source\DrupalSqlBase;

/**
 * This source plugin migrates Youtube Field.
 *
 * @MigrateSource(
 *   id = "youtube",
 *   source_module = "youtube"
 * )
 */
class YoutubeFieldSource extends DrupalSqlBase {

  /**
   * {@inheritdoc}
   */
  public function fields() {
    return [
      'field_youtube_field_input' => 'URL of video',
      'field_youtube_field_video_id' => 'video ID',
    ];
  }

  /**
   * {@inheritdoc}
   */
  public function getIds() {
    return [
      'input' => [
        'type' => 'string',
      ],
    ];
  }

  /**
   * {@inheritDoc}
   */
  public function query() {
    $query = NULL;
    foreach ($this->getYoutubeFieldNames() as $youtube_field_name) {
      $union_query = $this->select("field_data_$youtube_field_name", $youtube_field_name);
      $union_query->addField($youtube_field_name, "{$youtube_field_name}_input", 'input');
      static::addUnionQuery($query, $union_query);
    }
    $main_query = $this->select($query, 'all_yt')->fields('all_yt');
    $main_query->orderBy('all_yt.input');
    return $main_query;
  }

  /**
   * Fetch field names for Youtube fields.
   *
   * @return string[]
   *   array of Youtube field names.
   */
  protected function getYoutubeFieldNames(): array {
    $youtube_fields = $this->select('field_config')
      ->fields('field_config', ['field_name'])
      ->condition('type', 'youtube')
      ->condition('module', 'youtube')
      ->execute()
      ->fetchAll();
    $field_name = [];
    foreach ($youtube_fields as $youtube_field) {
      array_push($field_name, $youtube_field['field_name']);
    }
    return $field_name;
  }

  /**
   * Performs a query union.
   *
   * @param \Drupal\Core\Database\Query\SelectInterface|null $destination
   *   The "destination" query which should be extended.
   * @param \Drupal\Core\Database\Query\SelectInterface $source
   *   The query which should be added.
   */
  protected static function addUnionQuery(&$destination, SelectInterface $source) {
    if ($destination instanceof SelectInterface) {
      $destination->union($source);
      return;
    }
    $destination = clone $source;
  }

}
Loading