私は、Drupalに移行するために話すエンゲージメントのCSVを必要とするプロジェクトに取り組んでいます。 Migrateを使用すると、名前、タイトルなどの基本的なフィールドを移行できます。
ただし、speaker
フィールドはフィールドコレクションであり、私を混乱させています。フィールドコレクションでは無制限のスピーカーが許可されますが、CSVにはイベントごとに1つしかありません。説明されているようにnode_insert
フックを使用してみました here が、役に立ちませんでした。単一のスピーカーをスピーカーフィールドコレクションに移行するより良い/簡単な方法はありますか?
フィールドコレクションの問題 がフィールドコレクションの移行先にあります(コメント#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.
}
}
もう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 [〜#〜]:フィールドコレクションアイテムにファイルを追加する場合、明示的に指定しない限り、それらはロールバック時に削除されません。