Puncte:0

Cum migrez un câmp de paragraf imbricat?

drapel fi

Am un paragraf final, Aspect (para_layout), care are următoarele câmpuri.

introduceți descrierea imaginii aici

Am creat aceleași paragrafe și structură de câmp într-un site web Drupal 9. Am creat următorul plugin personalizat de migrare.

id: custom_para1
etichetă: migrare de paragraf personalizat
migration_group: personalizat
migration_tags:
  - nod
sursă:
  plugin: d7_paragraphs_item
  pachet: para_layout
proces:
  field_left_column: field_left_column
  field_right_column: field_right_column
destinaţie:
  plugin: 'entity_reference_revisions:paragraph'
  default_bundle: para_layout

drush mim custom_para1 arată că procesează articolele, dar nu am putut vedea nicio dată mutată în tabelele de câmp respective.

Funcționează bine când câmpurile sunt câmpuri de text normale în loc de câmpuri de paragraf.

Kevin avatar
drapel in
Mai întâi trebuie să migrați datele paragrafului și apoi să migrați înregistrările gazdei la care se referă nodul pentru a le conecta pe cele două.
ARUN avatar
drapel fi
@apaderno, deci înregistrările gazdei vor fi inserate direct prin SQL sau pot fi migrate și prin migrate yml?
apaderno avatar
drapel us
Migrați înregistrările gazdă în același mod în care migrați datele paragrafului. Aș aștepta un comentariu de la @Kevin, deoarece primul comentariu a fost postat de el.
ARUN avatar
drapel fi
@apaderno Am încercat să migrez intrarea gazdă, dar rezultatul este același. Drush show a procesat ceva, dar nu apare nimic în DB (am migrat deja conținutul paragrafului). Ar trebui să schimb „pluginul de destinație” cu altceva?
Puncte:3
drapel fr

Iată cum am reușit să o obțin.

Paragraf Migrație:

id: fup_balance_csv_import

....
....

proces:
  field_upload: field_upload
  field_download: field_download
  field_total: field_total

destinaţie:
  plugin: entity_reference_revisions:paragraph
  default_bundle: fup_balance

Migrarea nodului:

id: subscription_list_csv_import

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

proces:
  Câmp # Paragrafe.
  pseudo_field_fup_details:
    -
      plugin: migration_lookup
      migrare: fup_balance_csv_import
      sursa: titlu # Identificator unic.
  field_fup_details:
    -
      plugin: sub_proces
      sursă:
        - „@pseudo_field_fup_details”
      proces:
        target_id: „0”
        target_revision_id: „1”

Acest lucru se face prin utilizarea procesului standard de migrare. Uneori s-ar putea să nu fie util, atunci trebuie să vă scrieți propriul plugin de migrare. Mai jos este modalitatea de a face acest lucru.

Câmp # Paragrafe.
field_country_time_zones:
  -
    plugin: country_timezones_paragraphs
    sursă: 
      câmp_1: câmp_sursă_1
      câmp_2: câmp_sursă_2

Plugin de migrare:

<?php

namespace Drupal\countries_list_migration\Plugin\migrate\process;

utilizați Drupal\Core\Plugin\ContainerFactoryPluginInterface;
utilizați Drupal\migrate\MigrateExecutableInterface;
utilizați Drupal\migrate\ProcessPluginBase;
utilizați Drupal\migrate\Row;
utilizați Symfony\Component\DependencyInjection\ContainerInterface;
utilizați Drupal\paragraphs\Entity\Paragraph;
utilizați Drupal\Core\Logger\LoggerChannelFactoryInterface;

/**
 * Oferă un plugin de migrare country_timezones.
 *
 * Utilizare:
 *
 * @code
 *proces:
 *   bar:
 * plugin: country_timezones_paragraphs
 * sursă: nume_câmp_sursă
 * @endcode
 *
 * @MigrateProcessPlugin(
 * id = „country_timezones_paragraphs”,
 * handle_multiples = TRUE
 * )
 */
clasa CountryTimezonesParagraphs extinde ProcessPluginBase implementează ContainerFactoryPluginInterface {

  /**
   * Serviciu logger.
   *
   * @var \Drupal\Core\Logger\LoggerChannelFactoryInterface
   */
  protejat $logger;

  /**
   * Construiește un plugin CountriesTimezones.
   *
   * @param array $configurare
   * Configurația pluginului.
   * @param șir $plugin_id
   * ID-ul pluginului.
   * @param mixat $plugin_definition
   * Definiția pluginului.
   * @param \Drupal\Core\Logger\LoggerChannelFactoryInterface $logger
   * Serviciul logger.
   */
  funcția publică __construct(matrice $configurație, $id_plugin, $definiție_plugin, LoggerChannelFactoryInterface $logger) {
    parent::__construct($configuration, $plugin_id, $plugin_definition);
    $this->logger = $logger->get('countries_list_migration');
  }

  /**
   * {@inheritdoc}
   */
  funcția publică statică create(ContainerInterface $container, matrice $configurație, $plugin_id, $plugin_definition) {
    returnează static nou (
      $configurare,
      $plugin_id,
      $plugin_definition,
      $container->get('logger.factory')
    );
  }

  /**
   * {@inheritdoc}
   */
  Transformare funcție publică ($valoare, MigrateExecutableInterface $migrate_executable, Rând $rând, $proprietate_destinație) {

  $paragrafe =[];
  
   dacă (isset($valoare)) {
      $paragrafe[] = $this->createCountryTimezonesParagraphsItem($valoare);
    }

    returnează $paragrafe;
  }

  /**
   * {@inheritdoc}
   */
  funcția publică multiple(): bool {
    returnează TRUE;
  }


  funcția protejată createCountryTimezonesParagraphsItem(array $item): matrice {

    $paragraf = Paragraf::create([

      'type' => 'country_timezones',

      'field_1' => [
        'value' => $item['field_1'],
      ],
      'field_2' => [
        'value' => $item['field_2'],
      ],
    ]);

    $paragraf->salvare();

    întoarcere [
      'target_id' => $paragraph->id(),
      'target_revision_id' => $paragraph->getRevisionId(),
    ];
  }

}

Sper că este de ajutor.

Puncte:0
drapel in

După cum am spus în comentariu(e), pluginurile asigură în prezent că colecțiile de câmpuri sunt migrate către pachetele Paragraph și același lucru pentru d7 Paragraphs. Datele câmpului nu sunt mutate, acesta este un gol pe care trebuie să îl umpleți. Deci, trebuie să scrieți definiții de migrare YAML pentru a face acest lucru.

Am făcut recent o migrare d7 la d9 care avea această cerință (cu Field Collections și în combinația pe care l-am portat).

Va trebui să creați migrare(e) cu pluginuri sursă (interogările SQL care preiau datele pe care trebuie să le conectați) pentru a face următoarele:

  1. Migrați toate paragrafele reale și datele de câmp ale acestora
  2. Migrați paragrafele care conțin paragrafe (care dețin datele câmpului)
  3. Migrați înregistrările entităților care fac referire la paragrafele care dețin paragrafele de la pasul 2 (utilizați migration_lookup pentru a găsi noile lor ID-uri de destinație în D9).
ARUN avatar
drapel fi
Ar fi grozav dacă ați putea furniza un exemplu de fișiere yaml pentru a le consulta. După cum am menționat deja în întrebare, yaml-ul pe care l-am încercat nu funcționează.

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.