Điểm:1

How to use migrate process plugin concat on multiple values?

lá cờ 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.

Điểm:1
lá cờ ru

Tôi không nghĩ rằng điều này là có thể với concat trong một đường ống duy nhất, bởi vì bạn cần xác định hai nguồn cho concat và AFAIK, bạn không thể điền vào nguồn một phần kết quả từ phần trước và một phần với giá trị hoàn toàn mới.

Cách giải quyết: Sử dụng str_replace thay vào đó, là trình bao bọc cho PHP preg_replace.

preg_replace sẽ phát hiện nếu nguồn tương ứng chủ đề $ là một chuỗi hoặc một mảng. Nếu chủ đề $ là một mảng, tất cả các phần tử sẽ được cập nhật, vì vậy bạn có thể thay thế tất cả các phần đầu của chuỗi ^ với /một số/đường dẫn/

Một cái gì đó như thế này:

  trường_gallery:
    -
      plugin: str_replace
      biểu thức chính quy: đúng
      nguồn: thư viện
      tìm kiếm: '/^/'
      thay thế: '/một số/đường dẫn/'

(Lưu ý rằng các dấu gạch chéo trong Tìm kiếm không phải là dấu phân cách đường dẫn, chúng là biểu tượng kèm theo cho mẫu biểu thức chính quy)

lá cờ bv
Cảm ơn @Hudri, tôi chắc chắn thích sử dụng plugin quy trình `str_replace` hơn plugin tùy chỉnh. Bạn có thể nghĩ ra cách sử dụng hằng số nguồn, tức là `hằng số/file_source` thay vì mã hóa cứng giá trị của `replace` thành `'/some/path/'` không?
lá cờ ru
Không hẳn, đây là do thiết kế của mô-đun Di chuyển. Chỉ `nguồn:` được coi là một tham chiếu, tất cả các khóa khác được cấu hình và sử dụng như một giá trị.
Điểm:0
lá cờ bv

Dưới đây là những điểm nổi bật của plugin quy trình tôi đã viết, trong trường hợp bất kỳ ai quan tâm đến giải pháp tùy chỉnh:

lớp Chuẩn bị mở rộng ProcessPluginBase {

  hàm công khai biến đổi($value, MigrateExecutableInterface $migrate_executable, Row $row, $destination_property) {
    $return = [];
    foreach ($value as $item) {
      $return[] = nổ($item);
    }
    trả về $return;
  }

  hàm công khai bội() {
    trả về ĐÚNG;
  }

}

Lưu ý: một sự khác biệt quan trọng giữa cái này và cái concat plugin quy trình là phần bổ sung của nhiều() hàm trả về TRUE.

Nó có thể được sử dụng như sau:

trường_gallery:
  -
    plugin: phát nổ
    nguồn: gallery_images
    dấu phân cách: '|'
  -
    plugin: trả trước
    nguồn:
      - hằng số/file_source
      -
  -
    plugin: image_import
    đích: hằng số/file_destination
    uid: '@uid'
    Skip_on_missing_source: đúng

CHỈNH SỬA: FWIW Tôi đã chọn sử dụng giải pháp do @Hudri đề xuất.

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.