Как перенести объекты файлов в медиа-объекты?

Я использую модуль Migrate для миграции D7-D8, и я пишу всю миграцию вручную по коду (вместо использования встроенного модуля миграции D7, так как мне нужен более гранулированный контроль над миграцией.)

У меня есть следующая структура: на сайте D7 есть поле изображения, в котором изображения хранятся как сущности Файла. На сайте D8 поле изображения является ссылкой на объект носителя (и объект Media в свою очередь имеет поле «Изображение»).

Первоначально у меня было следующее для миграции моих изображений:

id: image_files

source:
  plugin: legacy_images
  constants:
    source_base_path: http://example.com/

destination:
  plugin: 'entity:file'

process:
  fid: fid
  filename: filename
  source_full_path:
    -
      plugin: concat
      delimiter: /
      source:
    -     constants/source_base_path
    -     uri
    -
      plugin: urlencode
  uri:
    plugin: file_copy
    source:
      - '@source_full_path'
      - uri
  filemime: filemime
  status: status

Внутри файла миграции узла моей статьи у меня было следующее:

'field_article_image/target_id':
plugin: migration
migration: image_files
source: field_article_image 

, но я понял, что это не сработает. Target_id, исходящий из миграции image_files, действительно был идентификатором File Entity, а не идентификатором медиа-объекта. В идеальном мире я бы хотел найти способ создать третью миграцию, которая создала бы этот средний шаг и перенесла бы сущности файла в медиа-объекты, а затем сопоставила бы эту миграцию с переносом статей. Однако я не могу понять, как это сделать.

План B будет просто создать плагин процесса для миграции изображений, который будет вручную создавать объекты файлов, прикреплять их к медиа-объектам и передавать этот переход на статьи (это удаляет средний шаг). Это означало бы, однако, что в то время как объекты Media могут быть отброшены назад, File Entities не могли.

6 голосов | спросил user1015214 4 +03002017-10-04T19:35:19+03:00312017bEurope/MoscowWed, 04 Oct 2017 19:35:19 +0300 2017, 19:35:19

2 ответа


2

Я решил сделать это несколько иначе: я создаю регулярный импорт файлов, устанавливаю эту миграцию в качестве источника для ссылки на ссылку на медиа-объект, а затем применяю второй плагин процесса MediaGenerate для перевода FID на новый media target_id

<?php

namespace Drupal\my_migration\Plugin\migrate\process;

use Drupal\media_entity\Entity\Media;
use Drupal\migrate\MigrateExecutableInterface;
use Drupal\migrate\MigrateException;
use Drupal\migrate\Row;
use Drupal\migrate_plus\Plugin\migrate\process\EntityGenerate;

/**
 * Generate a media entity with specified metadata.
 *
 * This plugin is to be used by migrations which have media entity reference
 * fields.
 *
 * Available configuration keys:
 * - destinationField: the name of the file field on the media entity.
 *
 * @code
 * process:
 *   'field_files/target_id':
 *     -
 *       plugin: migration
 *       source: files
 *     -
 *       plugin: media_generate
 *       destinationField: image
 *
 * @endcode
 *
 * @MigrateProcessPlugin(
 *   id = "media_generate"
 * )
 */
class MediaGenerate extends EntityGenerate {

/**
* {@inheritdoc}
*/
public function transform($value, MigrateExecutableInterface $migrateExecutable, Row $row, $destinationProperty) {
if (!isset($this->configuration['destinationField'])) {
  throw new MigrateException('Destination field must be set.');
}
// First load the target_id of the file referenced via the migration.
/* @var /Drupal/file/entity/File $file */
$file = $this->entityManager->getStorage('file')->load($value);

if (empty($file)) {
  throw new MigrateException('Referenced file does not exist');
}

// Creates a media entity if the lookup determines it doesn't exist.
$fileName = $file->label();
if (!($entityId = parent::transform($fileName, $migrateExecutable, $row, $destinationProperty))) {
  return NULL;
}
$entity = Media::load($entityId);

$fileId = $file->id();
$entity->{$this->configuration['destinationField']}->setValue($fileId);
$entity->save();

return $entityId;
}

}
ответил user1015214 2 42017vEurope/Moscow11bEurope/MoscowThu, 02 Nov 2017 18:33:18 +0300 2017, 18:33:18
0

Если вы хотите перенести файлы в Drupal 8 на медиа-объекты, вы можете использовать этот модуль: https://www.drupal.org/project/migrate_file_to_media

У него есть сценарий drush, который автоматически создает поля ссылки на медиа. Кроме того, он обнаруживает повторяющиеся изображения, используя двоичный хеш. И он поддерживает переводы.

ответил Brainski 21 AM000000100000003131 2018, 10:14:31

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132