web-dev-qa-db-ja.com

フィールドコレクションへの移行

私は、Drupalに移行するために話すエンゲージメントのCSVを必要とするプロジェクトに取り組んでいます。 Migrateを使用すると、名前、タイトルなどの基本的なフィールドを移行できます。

ただし、speakerフィールドはフィールドコレクションであり、私を混乱させています。フィールドコレクションでは無制限のスピーカーが許可されますが、CSVにはイベントごとに1つしかありません。説明されているようにnode_insertフックを使用してみました here が、役に立ちませんでした。単一のスピーカーをスピーカーフィールドコレクションに移行するより良い/簡単な方法はありますか?

4
digitxp

フィールドコレクションの問題 がフィールドコレクションの移行先にあります(コメント#222のパッチ内)。追加されたfield_collection.migrate.incファイルには、その使用方法に関するドキュメントが少し含まれています。

あなたの場合、あなたはあなたのCSVファイルをロードしてスピーキングエンゲージメントノードを作成するスピーキングエンゲージメント移行クラスを持っていると思います。その後、同じCSVファイルを読み込んでスピーカーフィールドコレクションを作成するには、スピーカー移行クラスが必要になります。この2番目の移行クラスは最初のクラスに依存するため、スピーカーが作成されると、スピーキングエンゲージメントにリンクされます。

何かのようなもの

class SpeakerMigration extends Migration {

  public function __construct($arguments) {
    parent::__construct($arguments);
    $this->dependencies = array('SpeakingEngagementMigration');
    $this->source = new MigrateSourceCSV('path/to/speaking/engagement.csv', array(), array());
    $this->destination = new MigrateDestinationFieldCollection('field_speakers',array('Host_entity_type' => 'node'));
    $this->map = new MigrateSQLMap($this->machineName, array(
      'id' => array(
        'type' => 'char',
        'length' => 40,
        'not null' => TRUE,
        'description' => t("Speaking Engagement's identifier"),
      )), MigrateDestinationFieldCollection::getKeySchema());
    $this->addFieldMapping('Host_entity_id', 'id')
      ->sourceMigration('SpeakingEngagementMigration');

    // ... Add field mapping here.
  }
}
5
Pierre Buyle

もう1つのオプションは、completeクラスのMigrationメソッドを実装し、プログラムでフィールドコレクションにデータを入力することです。

public function complete($entity, $row) {

  // load the newly created node (just in case entity isn't fully populated).
  $node = node_load($entity->nid);

  // set the values of all field collection fields
  $values = array(
    'field_name' => 'FIELD_COLLECTION_ITEM_FIELD_NAME',
    'field1'     => array(LANGUAGE_NONE => array(array('value' => 'VALUE'))),
    'field3'     => array(LANGUAGE_NONE => array(array('value' => 'VALUE'))),
  );

  // create the field collection item entity
  $item = entity_create('field_collection_item', $values);

  // attach it to the node loaded above
  $item->setHostEntity('node', $node);

  // save the entity
  $item->save();
}

[〜#〜] note [〜#〜]:フィールドコレクションアイテムにファイルを追加する場合、明示的に指定しない限り、それらはロールバック時に削除されません。

2
Scott Joudry