Это пример миграции данных из CSV файла в Drupal.
Данная миграция является основной в том смысле, что она ссылается на дочернюю миграцию, в ходе которой будут созданы параграфы (entity_reference_revisions:paragraph) с HTML контентом.
А далее мы используем migration_lookup, чтобы подтянуть айдишники параграфов и вставить их в нужное поле.
Мне нужно создать новую публикацию node:blog для каждой статьи из источника, которая представлена строкой в CSV файле (см. Описание входных данных). Картинка должна попасть в поле field_blog_image типа media reference (bundle: image).
Текст статьи должен превратится в параграф. В моем случает это параграф с машинным именем bp_simple, который помимо разных простых полей, имеет поле форматированного текста, куда и должен попасть исходный HTML. В блоге создано поле field_blog_components, оно как раз и является reference field для параграфов.
Файл конфигурации миграции custom_blog_csv_migrate_node:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 |
langcode: en status: true dependencies: enforced: module: - migrate_source_csv id: custom_blog_csv_migrate_node class: null field_plugin_method: null cck_plugin_method: null migration_tags: - 'Blog Migrate CSV' migration_group: custom_migration label: 'Blog CSV Migrate' source: batch_size: 1 plugin: csv header_offset: 0 enclosure: '"' escape: \ delimiter: ',' ids: - id process: uid: plugin: default_value default_value: 1 type: plugin: default_value default_value: blog title: title field_blog_summary: summary field_blog_image/target_id: source: thumbnail plugin: media_generate destination_bundle: image destination_field: field_media_image public_dir: test-public field_blog_category: source: category plugin: term_generate destination_bundle: blog_category field_blog_tag: - plugin: explode source: tags delimiter: ',' - plugin: term_generate destination_bundle: blog_tags field_blog_date: plugin: format_date from_format: Y-m-d to_format: Y-m-d source: date field_blog_components/target_id: - plugin: migration_lookup migration: custom_text_to_paragraph no_stub: true source: id - plugin: extract index: - '0' field_blog_components/target_revision_id: - plugin: migration_lookup migration: custom_text_to_paragraph no_stub: true source: id - plugin: extract index: - '1' destination: plugin: 'entity:node' migration_dependencies: required: - custom_text_to_paragraph |
Миграция использует пару кастомных обработчиков — term_generate и media_generate. По сути, мы могли бы следовать подходу аналогичному тому, что мы делаем в дочерней миграции, создавая параграфы.
Т.е. написать отдельную конфигурацию для изображений, добавить эту миграцию в секцию required и т.д. С одной стороны это не плохо, так мы используем однообразную логику и подход. С другой стороны, мне хотелось бы иметь больше контроля над процессом создания медиа-сущностей.
В принципе, выбирая в качестве ключа URL файла, или имя термина, мы можем добиться нужного поведения от Drupal.