Рейтинг:0

Перенос массива значений в несколько сущностей

флаг ph

Я использую модули migrate/migrate_plus для импорта файлов CSV и создания сущностей.

Один из столбцов в CSV может содержать несколько значений, таких как 1|2|3, которые я преобразовываю в массив, используя:

_юрисдикции:
  плагин: взорвать
  источник: юрисдикция
  разделитель: "|"

Затем я использую массив для создания терминов таксономии следующим образом:

поле_политический_район:
  -
    плагин: entity_generate
    источник: "@_jurisdictions"
    entity_type: таксономия_термин
    комплект: политический_район
    bundle_key: видео
    ключ_значения: имя
    ignore_case: правда
    ценности:
      field_display_name: ???

Я застрял на двух вещах:

  • Я хочу добавить постоянное значение к каждому имени, чтобы имя термина таксономии стало «1, XYZ», где XYZ происходит от констант/ABC
  • Я хочу, чтобы field_display_name было значением с префиксом «Район».

Любые мысли о том, как выполнить эти две вещи?

флаг ru
Отвечает ли это на ваш вопрос? [Как использовать подключаемый модуль процесса переноса для нескольких значений?](https://drupal.stackexchange.com/questions/307731/how-to-use-migrate-process-plugin-concat-on-multiple-values)
Lambic avatar
флаг ph
Я поэкспериментировал с использованием str_replace, но он не распознает константы, поэтому, если я задаю replace на константы/ABC, я получаю буквальные «константы/ABC». Также я не уверен, как бы я использовал это во втором сценарии настройки field_display_name.
флаг ru
Только `source:` может содержать ссылку, все остальные ключи являются конфигурационными и используются по значению. Это может быть *эстетически приятно*, если предоставить `constant/something`, но технически запись вашей строки в `replace: 'foo'` так же жестко запрограммирована, как запись ее в `constants/something: 'foo'`
Lambic avatar
флаг ph
Да, поэтому я не могу использовать str_replace. Константа исходит от производного, поэтому отличается в зависимости от того, какой CSV обрабатывается.
флаг ru
РЕДАКТИРОВАТЬ: Если вы используете основную версию > 9.2, вы можете создать какой-то сумасшедший [обратный вызов с unpack_source] (https://www.drupal.org/node/3205079)
Lambic avatar
флаг ph
Спасибо, так все выглядело, просто хотел подтвердить, что не было готового способа. Я опубликую свой плагин в качестве ответа, когда закончу.
флаг ru
Вы можете использовать новый обратный вызов версии 9.2 и создать вспомогательные переменные в разделе процесса.
Рейтинг:1
флаг ph

Вот пользовательский плагин, который я написал:

<?php

пространство имен Drupal\mymodule\Plugin\migrate\process;

используйте Drupal\migrate\MigrateExecutableInterface;
используйте Drupal\migrate\Row;
используйте Drupal\migrate_plus\Plugin\migrate\process\EntityGenerate;
используйте Drupal\migrate_plus\Plugin\migrate\process\EntityLookup;

/**
 * Этот плагин генерирует районные объекты в плагине процесса.
 *
 * @MigrateProcessPlugin(
 * id = "район_генерировать"
 * )
 *
 * @см. EntityGenerate
 *
 * @код
 * процесс:
 * поле_политический_район:
 * плагин: District_generate
 * источник: юрисдикция
 * District_set_name: константы/ABC
 * District_set_value: "@_district_set"
 * префикс: «Район»
 * ... другая сущность Генерировать конфиг
 * @конечный код
 */
класс DistrictGenerate расширяет EntityGenerate {

  /**
   * {@inheritdoc}
   */
  публичная функция преобразования ($ значение, MigrateExecutableInterface $ migrateExecutable, строка $ строка, $ destinationProperty) {
    $this->строка = $строка;
    $this->migrateExecutable = $migrateExecutable;
    $имя = $значение;
    если (isset($this->configuration['district_set_name'])) {
      $suffix = $row->get($this->configuration['district_set_name']);
      $имя = $имя. ', ' . суффикс $;
    }
    // Создает объект, если поиск определяет, что он не существует.
    if (!($result = EntityLookup::transform($name, $migrateExecutable, $row, $destinationProperty))) {
      если (isset($this->configuration['district_set_value'])) {
        $this->configuration['values']['field_district_set'] = $this->configuration['district_set_value'];
      }
      $prefix = $this->configuration['prefix'] ?? 'Округ';
      $this->configuration['default_values']['field_display_name'] = $prefix . ' ' . $значение;
      $result = $this->generateEntity($name);
    }
    вернуть $результат;
  }

}

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

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