Я использую модуль Migrate для миграции с D7 на D8 и пишу всю миграцию вручную в коде (вместо того, чтобы использовать встроенный модуль миграции D7, так как я хотел более детального управления миграцией).
У меня есть следующая структура: сайт D7 имеет поле изображения, где изображения хранятся в виде файловых объектов. На сайте D8 поле изображения является ссылкой на объект Media (а объект Media, в свою очередь, имеет поле Image).
Первоначально у меня было следующее для миграции изображений:
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 File ID, а не идентификатором объекта Media. В идеальном мире я хотел бы найти способ создать третью миграцию, которая создала бы этот средний шаг, и перенести файловые сущности в медиа-сущности, а затем сопоставить эту миграцию с миграцией статей. Тем не менее, я не могу найти хороший способ сделать это.
План B будет состоять в том, чтобы просто создать плагин процесса для миграции изображений, который будет вручную создавать файловые объекты, прикреплять их к медиа-объектам и передавать эту миграцию в Статьи (это удаляет средний шаг). Это будет означать, однако, что, хотя сущности Media можно откатить, объекты File не могут.
field_media_image
.Я высоко оценил принятый ответ, однако он уже имел некоторые устаревшие определения и не поддерживал публикацию свойств изображения alt и title. Таким образом, я немного улучшил его, чтобы поддерживать это и работать гладко с последним Drupal 8.6.x. Вот код MediaGenerate.php (соответствующий синтаксис Yaml находится внутри комментария к документу):
источник
Поскольку Media является типом сущности, вы должны создать свою собственную миграцию. Вы можете создать новый источник из таблицы файлов. Вот пример
https://gist.github.com/jibran/8e7cd2319e873858dd49a272227a4fd2
Затем
migration_lookup
вы можете сопоставить поля, как это.источник
Если вы хотите перенести файлы в Drupal 8 на медиа-объекты, вы можете использовать этот модуль: https://www.drupal.org/project/migrate_file_to_media
У него есть сценарий Drush, который автоматически создает поля ссылок на медиа. Кроме того, он обнаруживает дубликаты изображений, используя двоичный хэш. И это поддерживает переводы.
источник