Puncte:1

How to use migrate process plugin concat on multiple values?

drapel bv

I am trying to import from a csv that has multiple files in the same column, e.g.

title,gallery,tag
node1,img1.jpg|img2.jpg|img3.jpg,2
node2,img4.jpg,2
node3,img5.jpg|img6.jpg,3

I need to prepend the path to these file names to get something of the form /path/to/file/img4.jpg.

I have written a process pipeline similar to the following (which doesn't work):

source:
  constants:
    file_source: '/import/images/'
    file_destination: '/path/to/file/'
process:
  title: title
  field_gallery:
    -
      plugin: explode
      source: gallery
      delimiter: '|'
    -
      plugin: concat
      source:
        - constants/file_source
        -
    -
      plugin: image_import
      destination: constants/file_destination

The failure comes because the Concat plugin implodes the array containing a string and an array to give an output in the form /path/to/file/Array.

I suspect there is a process plugin that I can insert between explode and concat that will solve this, but I can't work out what it is.

I have tried combinations of the plugins single_value and multiple_values from the Migrate Plus module, but that has not worked either.

For now I have written a custom process plugin to replace concat, but I would prefer a pipeline using pre-existing plugins.

Puncte:1
drapel ru

Nu cred că este posibil asta cu concat într-o singură conductă, deoarece trebuie să definiți două surse pentru concat, iar AFAIK nu puteți umple sursa parțial cu rezultatul din secțiunea anterioară și parțial cu o valoare complet nouă.

Soluție: utilizați str_replace plugin în schimb, care este un wrapper pentru PHP preg_replace.

preg_replace va detecta dacă sursă respectiv $subiect este un șir sau o matrice. Dacă $subiect este o matrice, toate elementele vor fi actualizate, astfel încât să puteți înlocui toate începuturile unui șir ^ cu /unele/cale/

Ceva de genul:

  field_gallery:
    -
      plugin: str_replace
      regex: adevărat
      sursa: galerie
      căutare: '/^/'
      înlocuiți: „/unele/cale/”

(Rețineți că barele oblice căutare nu sunt delimitatori de cale, ele sunt simbolul de încadrare pentru modelul regex)

drapel bv
Mulțumesc @Hudri, cu siguranță prefer să folosesc pluginul de proces `str_replace` decât un plugin personalizat. Vă puteți gândi la o modalitate de a utiliza o constantă sursă, adică „constants/file_source” în loc să codificați valoarea „replace” în „/some/path/”?
drapel ru
Nu chiar, aceasta este prin proiectarea modulului Migrare. Doar „sursa:” este tratată ca o referință, toate celelalte chei sunt configurate și utilizate ca o valoare.
Puncte:0
drapel bv

Iată punctele importante ale pluginului de proces pe care l-am scris, în cazul în care cineva este interesat de o soluție personalizată:

clasa Prepend extinde ProcessPluginBase {

  Transformare funcție publică ($valoare, MigrateExecutableInterface $migrate_executable, Rând $rând, $proprietate_destinație) {
    $retur = [];
    foreach ($valoare ca $articol) {
      $return[] = implode($element);
    }
    return $retur;
  }

  funcția publică multiple() {
    returnează TRUE;
  }

}

Notă: o diferență importantă între aceasta și concat pluginul de proces este adăugarea multiplu() funcție care returnează TRUE.

Poate fi folosit după cum urmează:

field_gallery:
  -
    plugin: explode
    sursa: galerie_imagini
    delimitator: '|'
  -
    plugin: antecedente
    sursă:
      - constante/sursa_fișier
      -
  -
    plugin: import_image
    destinație: constante/destinație_fișier
    uid: „@uid”
    skip_on_missing_source: adevărat

EDITAȚI | ×: FWIW Am ales să folosesc soluția sugerată de @Hudri.

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.