Loading migrations/d7_youtube_field.yml 0 → 100644 +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 src/Plugin/migrate/field/Youtube.php 0 → 100644 +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', ], ], ] ); } } src/Plugin/migrate/process/MediaImageFieldSettings.php +3 −1 Original line number Diff line number Diff line Loading @@ -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; Loading src/Plugin/migrate/process/MediaInternetFieldValue.php +5 −3 Original line number Diff line number Diff line Loading @@ -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; } Loading src/Plugin/migrate/source/YoutubeFieldSource.php 0 → 100644 +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
migrations/d7_youtube_field.yml 0 → 100644 +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
src/Plugin/migrate/field/Youtube.php 0 → 100644 +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', ], ], ] ); } }
src/Plugin/migrate/process/MediaImageFieldSettings.php +3 −1 Original line number Diff line number Diff line Loading @@ -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; Loading
src/Plugin/migrate/process/MediaInternetFieldValue.php +5 −3 Original line number Diff line number Diff line Loading @@ -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; } Loading
src/Plugin/migrate/source/YoutubeFieldSource.php 0 → 100644 +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; } }