Puncte:0

Migrarea unei matrice de valori în mai multe entități

drapel ph

Folosesc modulele migrate/migrate_plus pentru a importa fișiere CSV și a genera entități.

Una dintre coloanele din CSV poate conține mai multe valori precum 1|2|3, pe care le convertesc într-o matrice folosind:

_jurisdicții:
  plugin: explode
  sursa: jurisdictie
  delimitator: "|"

Folosesc apoi matricea pentru a genera termeni de taxonomie cu asta:

field_political_district:
  -
    plugin: entity_generate
    sursa: „@_jurisdictions”
    entity_type: taxonomy_term
    pachet: district_politic
    bundle_key: vid
    value_key: nume
    ignore_case: adevărat
    valori:
      field_display_name: ???

Sunt blocat de două lucruri:

  • Vreau să atașez o valoare constantă fiecărui nume, astfel încât numele termenului de taxonomie să devină „1, XYZ”, unde XYZ provine de la constante/ABC
  • Vreau ca field_display_name să fie valoarea prefixată cu „District”

Aveți vreo idee despre cum să realizați aceste două lucruri?

drapel ru
Răspunde asta la întrebarea ta? [Cum se utilizează pluginul de proces de migrare concat pe mai multe valori?](https://drupal.stackexchange.com/questions/307731/how-to-use-migrate-process-plugin-concat-on-multiple-values)
Lambic avatar
drapel ph
M-am jucat cu utilizarea str_replace, dar nu recunoaște constantele, așa că dacă setez înlocuire la constante/ABC, primesc literalul „constante/ABC”. De asemenea, nu sunt sigur cum aș folosi asta în al doilea scenariu de setare field_display_name.
drapel ru
Numai „sursa:” poate conține o referință, toate celelalte chei sunt configurate și utilizate după valoare. Ar putea fi *plăcut din punct de vedere estetic* dacă este prevăzut cu `constant/something`, dar tehnic scrierea șirului dvs. în `replace: 'foo'` este la fel de codificat ca și scrierea lui în `constants/something: 'foo'`
Lambic avatar
drapel ph
Da, de aceea nu pot folosi str_replace. Constanta provine de la un derivat, deci este diferită în funcție de ce csv este procesat.
drapel ru
EDITARE: Dacă utilizați versiunea de bază > 9.2, s-ar putea să creați un [callback nebunesc cu unpack_source](https://www.drupal.org/node/3205079)
Lambic avatar
drapel ph
Mulțumesc, așa arătau lucrurile, am vrut doar să confirm că nu există o modalitate ieșită din cutie... Voi posta pluginul meu ca răspuns când termin.
drapel ru
Puteți utiliza noua versiune de apel inversă v9.2 și puteți crea variabile de ajutor în secțiunea de proces.
Puncte:1
drapel ph

Iată pluginul personalizat pe care am ajuns să-l scriu:

<?php

spațiu de nume Drupal\mymodule\Plugin\migrate\process;

utilizați Drupal\migrate\MigrateExecutableInterface;
utilizați Drupal\migrate\Row;
utilizați Drupal\migrate_plus\Plugin\migrate\process\EntityGenerate;
utilizați Drupal\migrate_plus\Plugin\migrate\process\EntityLookup;

/**
 * Acest plugin generează entități districtuale în cadrul pluginului de proces.
 *
 * @MigrateProcessPlugin(
 * id = "district_generate"
 * )
 *
 * @see EntityGenerate
 *
 * @code
 *proces:
 * field_political_district:
 * plugin: district_generate
 * sursa: jurisdictie
 * district_set_name: constante/ABC
 * district_set_value: „@_district_set”
 * prefix: „District”
 * ... altă entitateGenerați configurația
 * @endcode
 */
clasa DistrictGenerate extinde EntityGenerate {

  /**
   * {@inheritdoc}
   */
  transformare funcție publică ($valoare, MigrateExecutableInterface $migrateExecutable, Rând $rând, $destinationProperty) {
    $acest->rând = $rând;
    $this->migrateExecutable = $migrateExecutable;
    $nume = $valoare;
    if (isset($this->configuration['district_set_name'])) {
      $sufix = $row->get($this->configuration['district_set_name']);
      $nume = $nume . ', ' . $sufix;
    }
    // Creează o entitate dacă căutarea determină că nu există.
    dacă (!($rezultat = EntityLookup::transform($name, $migrateExecutable, $row, $destinationProperty))) {
      dacă (isset($this->configuration['district_set_value'])) {
        $this->configuration['values']['field_district_set'] = $this->configuration['district_set_value'];
      }
      $prefix = $this->configuration['prefix'] ?? 'District';
      $this->configuration['default_values']['field_display_name'] = $prefix . ' ' . $valoare;
      $rezultat = $this->generateEntity($name);
    }
    returnează $rezultat;
  }

}

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.