Рейтинг: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.

Рейтинг:1
флаг ru

Я не думаю, что это возможно с конкат в одном канале, потому что вам нужно определить два источника для concat, и, насколько мне известно, вы не можете частично заполнить источник результатом из предыдущего раздела, а частично - совершенно новым значением.

Обходной путь: используйте str_replace вместо этого плагин, который является оболочкой для PHP preg_replace.

preg_replace обнаружит, если источник соответственно $субъект является строкой или массивом. Если $субъект это массив, все элементы будут обновлены, поэтому вы можете заменить все начала строки ^ с /какой-то/путь/

Что-то вроде этого:

  поле_галерея:
    -
      плагин: str_replace
      регулярное выражение: правда
      источник: галерея
      поиск: '/^/'
      заменить: '/некоторые/путь/'

(Обратите внимание, что косые черты в поиск не являются разделителями пути, они являются символом, охватывающим шаблон регулярного выражения)

флаг bv
Спасибо @Hudri, я определенно предпочитаю использовать плагин процесса `str_replace`, чем пользовательский плагин. Можете ли вы придумать способ использовать исходную константу, то есть `constants/file_source`, а не жестко кодировать значение `replace` на `'/some/path/'`?
флаг ru
Не совсем, это дизайн модуля Migrate. Только `source:` рассматривается как ссылка, все остальные ключи являются конфигурационными и используются как значение.
Рейтинг:0
флаг bv

Вот основные моменты плагина процесса, который я написал, на случай, если кого-то заинтересует собственное решение:

класс Prepend расширяет ProcessPluginBase {

  общедоступная функция преобразования ($ значение, MigrateExecutableInterface $ migrate_executable, строка $ строка, $ destination_property) {
    $возврат = [];
    foreach ($ значение как $ элемент) {
      $return[] = взорвать($item);
    }
    возврат $возврат;
  }

  общественная функция множественная () {
    вернуть ИСТИНА;
  }

}

Примечание: важное различие между этим и конкат Плагин процесса является дополнением несколько() функция, которая возвращает ИСТИНА.

Его можно использовать следующим образом:

поле_галерея:
  -
    плагин: взорвать
    источник: галерея_изображений
    разделитель: '|'
  -
    плагин: добавьте
    источник:
      - константы/источник_файла
      -
  -
    плагин: image_import
    назначение: константы/file_destination
    идентификатор пользователя: '@uid'
    skip_on_missing_source: правда

РЕДАКТИРОВАТЬ: FWIW Я решил использовать решение, предложенное @Hudri.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.