Korzystam z modułu migracji do migracji z D7 na D8 i piszę całą migrację ręcznie w kodzie (zamiast używać wbudowanego modułu migracji D7, ponieważ chciałem bardziej szczegółowej kontroli nad migracją).
Mam następującą strukturę: strona D7 ma pole obrazu, w którym obrazy są przechowywane jako byty plików. W witrynie D8 pole obrazu jest odniesieniem do obiektu Media (a obiekt Media z kolei ma pole Image).
Początkowo miałem do migracji obrazy:
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
W moim pliku migracji węzła artykułu miałem następujące elementy:
'field_article_image/target_id':
plugin: migration
migration: image_files
source: field_article_image
ale zdałem sobie sprawę, że to nie zadziała. Identyfikator target pochodzący z migracji image_files był naprawdę identyfikatorem jednostki pliku, a nie identyfikatorem jednostki medialnej. W idealnym świecie chciałbym znaleźć sposób na utworzenie trzeciej migracji, która stworzyłaby ten środkowy krok i migrował by podmioty plików do encji medialnych, a następnie zamapował tę migrację na migrację artykułów. Jednak nie mogę znaleźć dobrego sposobu na zrobienie tego.
Plan B będzie polegał po prostu na stworzeniu wtyczki procesowej do migracji obrazów, która ręcznie utworzy encje plików, przyczepi je do encji medialnych i przekaże tę migrację do artykułów (usuwa to środkowy krok). Oznaczałoby to jednak, że chociaż encje multimedialne można wycofać, encje plików nie mogą.
field_media_image
.Bardzo doceniam przyjętą odpowiedź, jednak miała ona już trochę przestarzałe definicje i nie obsługiwała publikowania właściwości obrazu alt i tytułu. Dlatego trochę go ulepszyłem, aby to obsługiwać i pracować płynnie z najnowszym Drupalem 8.6.x. Oto kod MediaGenerate.php (odpowiednia składnia Yamla znajduje się w komentarzu do dokumentu):
źródło
Ponieważ Media to typ encji, należy utworzyć własną migrację. Możesz wygenerować nowe źródło z tabeli plików. Oto przykład
https://gist.github.com/jibran/8e7cd2319e873858dd49a272227a4fd2
Następnie
migration_lookup
możesz zmapować takie pola.źródło
Jeśli chcesz migrować pliki w Drupal 8 do encji medialnych, możesz użyć tego modułu: https://www.drupal.org/project/migrate_file_to_media
Ma skrypt Drush, który automatycznie tworzy pola odniesienia mediów. Dodatkowo wykrywa zduplikowane obrazy za pomocą binarnego skrótu. I obsługuje tłumaczenia.
źródło