Рейтинг:0

Как перенести поле вложенного абзаца?

флаг fi

У меня есть абзац-обертка, Макет (para_layout), который имеет следующие поля.

введите описание изображения здесь

Я создал ту же структуру абзацев и полей на веб-сайте Drupal 9. Я создал следующий настраиваемый плагин миграции.

идентификатор: custom_para1
label: перенос пользовательских абзацев
миграционная_группа: пользовательская
миграционные_теги:
  - узел
источник:
  плагин: d7_paragraphs_item
  пакет: para_layout
процесс:
  field_left_column: поле_left_column
  field_right_column: field_right_column
пункт назначения:
  плагин: 'entity_reference_revisions:paragraph'
  default_bundle: para_layout

драш мим custom_para1 показывает, что он обрабатывает элементы, но я не видел никаких данных, перемещенных в соответствующие таблицы полей.

Он отлично работает, когда поля являются обычными текстовыми полями, а не полями абзаца.

Kevin avatar
флаг in
Вы должны сначала перенести данные абзаца, а затем перенести их записи хоста, на которые ссылается узел, чтобы соединить их.
ARUN avatar
флаг fi
@apaderno, поэтому записи хоста будут вставлены напрямую через SQL или их также можно перенести через migrate yml?
apaderno avatar
флаг us
Вы переносите записи хоста так же, как переносите данные абзаца. Я бы дождался комментария от @Kevin, так как первый комментарий был опубликован им.
ARUN avatar
флаг fi
@apaderno Я пытался перенести запись хоста, но результат тот же. Drush show что-то обработало, но ничего не показывает в БД (я уже перенес содержимое абзаца). Должен ли я изменить «плагин назначения» на что-то другое?
Рейтинг:3
флаг fr

Вот как я смог этого добиться.

Перенос абзаца:

идентификатор: fup_balance_csv_import

....
....

процесс:
  поле_загрузка: поле_загрузка
  field_download: field_download
  общее_поле: общее_поле

пункт назначения:
  плагин: entity_reference_revisions:абзац
  default_bundle: fup_balance

Миграция узла:

идентификатор: subscribe_list_csv_import

.............
........

процесс:
  # Поле абзацев.
  псевдо_поле_фуп_детали:
    -
      плагин: migration_lookup
      миграция: fup_balance_csv_import
      источник: title # Уникальный идентификатор.
  field_fup_details:
    -
      плагин: sub_process
      источник:
        - '@pseudo_field_fup_details'
      процесс:
        target_id: '0'
        target_revision_id: '1'

Для этого используется стандартный процесс миграции. Иногда это может быть бесполезно, тогда вам нужно написать свой собственный плагин миграции. Ниже приведен способ сделать это.

# Поле абзацев.
field_country_time_zones:
  -
    плагин: country_timezones_paragraphs
    источник: 
      поле_1: исходное_поле_1
      поле_2: исходное_поле_2

Плагин миграции:

<?php

пространство имен Drupal\countries_list_migration\Plugin\migrate\process;

используйте Drupal\Core\Plugin\ContainerFactoryPluginInterface;
используйте Drupal\migrate\MigrateExecutableInterface;
используйте Drupal\migrate\ProcessPluginBase;
используйте Drupal\migrate\Row;
используйте Symfony\Component\DependencyInjection\ContainerInterface;
используйте Drupal\paragraphs\Entity\Paragraph;
используйте Drupal\Core\Logger\LoggerChannelFactoryInterface;

/**
 * Предоставляет подключаемый модуль миграции country_timezones.
 *
 * Применение:
 *
 * @код
 * процесс:
 *   бар:
 * плагин: country_timezones_paragraphs
 * источник: source_field_name
 * @конечный код
 *
 * @MigrateProcessPlugin(
 * id = "country_timezones_paragraphs",
 * handle_multiples = ИСТИНА
 * )
 */
класс CountryTimezonesParagraphs расширяет ProcessPluginBase, реализует ContainerFactoryPluginInterface {

  /**
   * Сервис регистратора.
   *
   * @var\Drupal\Core\Logger\LoggerChannelFactoryInterface
   */
  защищенный регистратор $;

  /**
   * Создает плагин CountryTimezones.
   *
   * @param массив $configuration
   * Конфигурация плагина.
   * @param строка $plugin_id
   * Идентификатор плагина.
   * @param смешанный $plugin_definition
   * Определение плагина.
   * @param \Drupal\Core\Logger\LoggerChannelFactoryInterface $logger
   * Служба регистратора.
   */
  публичная функция __construct (массив $configuration, $plugin_id, $plugin_definition, LoggerChannelFactoryInterface $logger) {
    parent::__construct($configuration, $plugin_id, $plugin_definition);
    $this->logger = $logger->get('countries_list_migration');
  }

  /**
   * {@inheritdoc}
   */
  общедоступная статическая функция create(ContainerInterface $container, массив $configuration, $plugin_id, $plugin_definition) {
    вернуть новую статику(
      $ конфигурация,
      $plugin_id,
      $plugin_definition,
      $container->get('logger.factory')
    );
  }

  /**
   * {@inheritdoc}
   */
  общедоступная функция преобразования ($ значение, MigrateExecutableInterface $ migrate_executable, строка $ строка, $ destination_property) {

  $параграфы =[];
  
   если (установить ($ значение)) {
      $paragraphs[] = $this->createCountryTimezonesParagraphsItem($value);
    }

    вернуть $параграфы;
  }

  /**
   * {@inheritdoc}
   */
  публичная функция множественная(): bool {
    вернуть ИСТИНА;
  }


  защищенная функция createCountryTimezonesParagraphsItem (массив $ item): массив {

    $абзац = абзац::создать([

      'type' => 'country_timezones',

      'поле_1' => [
        'значение' => $item['field_1'],
      ],
      'поле_2' => [
        'значение' => $item['field_2'],
      ],
    ]);

    $абзац->сохранить();

    возвращаться [
      'target_id' => $paragraph->id(),
      'target_revision_id' => $paragraph->getRevisionId(),
    ];
  }

}

Надеюсь, это полезно.

Рейтинг:0
флаг in

Как я уже сказал в комментариях, плагины в настоящее время обеспечивают миграцию коллекций полей в пакеты абзацев и то же самое для абзацев d7. Данные поля не перемещаются, это пробел, который вам в настоящее время необходимо заполнить самостоятельно. Поэтому вам нужно написать определения миграции YAML, чтобы сделать это.

Недавно я выполнил миграцию с d7 на d9, в которой было это требование (включая коллекции полей, которые мы портировали).

Вам нужно будет создать миграцию(и) с исходными плагинами (запросы SQL, которые извлекают данные, которые вам нужно подключить), чтобы сделать следующее:

  1. Перенести все фактические абзацы и данные их полей
  2. Перенос абзацев, содержащих абзацы (содержащие данные поля)
  3. Перенесите записи сущностей, которые ссылаются на абзацы, содержащие абзацы из шага 2 (используйте migration_lookup, чтобы найти их новые идентификаторы назначения в D9).
ARUN avatar
флаг fi
Было бы здорово, если бы вы предоставили образцы файлов yaml для справки. Как я уже упоминал в вопросе, yaml, который я пробовал, не работает.

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

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