Score:1

How to use migrate process plugin concat on multiple values?

ธง 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.

Score:1
ธง ru

ฉันไม่คิดว่าจะเป็นไปได้กับ เชื่อม ในไพพ์เดียว เนื่องจากคุณต้องกำหนดสองแหล่งที่มาสำหรับ concat และ AFAIK คุณไม่สามารถเติมแหล่งที่มาบางส่วนด้วยผลลัพธ์จากส่วนก่อนหน้า และบางส่วนด้วยค่าใหม่ทั้งหมด

วิธีแก้ปัญหา: ใช้ str_แทนที่ ปลั๊กอินแทนซึ่งเป็นตัวห่อหุ้มสำหรับ PHP preg_replace.

preg_replace จะตรวจพบว่า แหล่งที่มา ตามลำดับ $เรื่อง เป็นสตริงหรืออาร์เรย์ ถ้า $เรื่อง เป็นอาร์เรย์ องค์ประกอบทั้งหมดจะได้รับการอัปเดต ดังนั้นคุณจึงสามารถแทนที่จุดเริ่มต้นทั้งหมดของสตริงได้ ^ กับ /บาง/เส้นทาง/

สิ่งนี้:

  field_gallery:
    -
      ปลั๊กอิน: str_replace
      regex: จริง
      ที่มา: แกลเลอรี่
      ค้นหา: '/^/'
      แทนที่: '/some/path/'

(โปรดทราบว่าเครื่องหมายทับใน ค้นหา ไม่ใช่ตัวคั่นเส้นทาง แต่เป็นสัญลักษณ์ล้อมรอบสำหรับรูปแบบ regex)

bv flag
ขอบคุณ @Hudri ฉันชอบใช้ปลั๊กอินกระบวนการ `str_replace` มากกว่าปลั๊กอินที่กำหนดเอง คุณนึกถึงวิธีใช้ค่าคงที่ต้นทาง เช่น `constants/file_source` แทนการฮาร์ดโค้ดค่าของ `replace` เป็น `'/some/path/'` ได้หรือไม่
ru flag
ไม่จริง นี่เป็นเพราะการออกแบบของโมดูลการโยกย้าย เฉพาะ `แหล่งที่มา:` เท่านั้นที่ถือเป็นข้อมูลอ้างอิง คีย์อื่นๆ ทั้งหมดจะถูกกำหนดค่าและใช้เหมือนค่า
Score:0
ธง bv

นี่คือไฮไลท์ของปลั๊กอินกระบวนการที่ฉันเขียนไว้ เผื่อใครสนใจโซลูชันแบบกำหนดเอง:

คลาส Prepend ขยาย ProcessPluginBase {

  การแปลงฟังก์ชันสาธารณะ ($value, MigrateExecutableInterface $migrate_executable, แถว $row, $destination_property) {
    $return = [];
    foreach (มูลค่า $ เป็น $ item) {
      $return[] = ระเบิด($item);
    }
    ส่งคืน $return;
  }

  ฟังก์ชั่นสาธารณะหลายรายการ () {
    กลับ TRUE;
  }

}

หมายเหตุ: ความแตกต่างที่สำคัญระหว่างสิ่งนี้กับ เชื่อม ปลั๊กอินกระบวนการเป็นส่วนเสริมของ หลายรายการ() ฟังก์ชันที่คืนค่า TRUE

สามารถใช้งานได้ดังนี้:

field_gallery:
  -
    ปลั๊กอิน: ระเบิด
    ที่มา: gallery_images
    ตัวคั่น: '|'
  -
    ปลั๊กอิน: เสริม
    แหล่งที่มา:
      - ค่าคงที่ / file_source
      -
  -
    ปลั๊กอิน: image_import
    ปลายทาง: ค่าคงที่/file_destination
    uid: '@uid'
    skip_on_missing_source: จริง

แก้ไข: FWIW ฉันได้เลือกใช้โซลูชันที่แนะนำโดย @Hudri

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา