Рейтинг:0

Using root source property within migrate sub_process plugin

флаг gb

I'm performing migration from Drupal 9 into another Drupal 9 project. Let's say "content features" migration.

In a node migration I'm trying to create stubs for media items.

The media source has two id keys: mid, langcode. The mid key is getting from field's target_id property. But there is no language property on field's level and I'm trying to pass node's language as second id value for the media lookup.

The migrate_lookup plugin tries to find media entity by mid and langcode properties: MigrationLookup::transform():

if (isset($this->configuration['source_ids'][$lookup_migration_id])) {
  $lookup_value = array_values($row->getMultiple($this->configuration['source_ids'][$lookup_migration_id]));
}

then getMultiple() tries to get values from the current iteration.

Does someone know how to pass root row instead of iteration row?

...
process:
  langcode: langcode
  ...

  field_cover_image:
    - plugin: sub_process
      source: field_cover_image
      process:
        lang:
          plugin: default_value
          default_value: 'en'
        target_id:
          plugin: migration_lookup
          source: target_id
          migration: migrate_media_image
          source_ids:
            migrate_media_image:
              - target_id
              - ROOT_ROW_SOURCE_PROPERTY_LANGCODE

I wonder also if it possible to use constants within sub_process and $row->getMultiple()?

An example:

...
      process:
        target_id:
          plugin: migration_lookup
          source: target_id
          migration: migrate_media_image
          source_ids:
            migrate_media_image:
              - target_id
              - constants/default_language
Рейтинг:0
флаг gb

Я понял это из подпроцесс документация плагина:

/**
 * Доступные ключи конфигурации:
 * ...
 * - include_source: (необязательно) Если TRUE, все исходные конфигурации плагинов и
 * значения будут скопированы в подобработанную строку в новом свойстве с именем
 * для значения конфигурации source_key (см. ниже). По умолчанию ЛОЖЬ.
 * - source_key: (необязательно) Если include_source имеет значение TRUE, это
 * — имя свойства подобрабатываемой строки, которая будет содержать
 * Исходная конфигурация и значения. Игнорируется, если include_source
 *     ЛОЖНЫЙ. По умолчанию используется значение «источник», если значение не указано.
 */

И использовал его как:

  field_cover_image:
    - плагин: sub_process
      источник: field_cover_image
      include_source: правда
      source_key: корень
      процесс:
        target_id:
          плагин: migration_lookup
          источник: target_id
          миграция: migrate_media_image
          исходные_идентификаторы:
            migrate_media_image:
              - target_id
              - root/langcode # <- получить свойство из корневой строки

И константы причины также будут доступны:

migrate_media_image:
  - target_id
  - корень/константы/язык_по умолчанию

Альтернативой может быть создание свойства итерации в качестве значения по умолчанию:

  плагин: sub_process
  источник: field_cover_image
  процесс:
    язык:
      плагин: default_value
      default_value: 'ru'

и обращение к нему как к свойству назначения текущей итерации @язык:

    язык:
      плагин: default_value
      default_value: 'ru'
    target_id:
      плагин: migration_lookup
      источник: target_id
      исходные_идентификаторы:
        migrate_media_image:
          - target_id
          - '@язык'

Типы содержимого/медиа настроены на перевод, но на самом деле есть только один язык, и я могу «жестко закодировать» его, но лучше использовать динамическое значение.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.