Created
February 18, 2013 15:06
-
-
Save bitamar/4978059 to your computer and use it in GitHub Desktop.
garmentbox_migrate.migrate.field_collection_destination.inc
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
/** | |
* Destination class implementing migration into field_collection. | |
*/ | |
class garmentboxMigrateDestinationFieldCollection extends MigrateDestinationEntity { | |
/** | |
* The type of entity hosting this collection field (e.g., node). | |
* | |
* @var string | |
*/ | |
protected $hostEntityType; | |
static public function getKeySchema() { | |
return array( | |
'cid' => array( | |
'type' => 'int', | |
'unsigned' => TRUE, | |
'not null' => TRUE, | |
'description' => 'ID of field collection item', | |
), | |
); | |
} | |
/** | |
* Basic initialization. | |
* | |
* @param array $options | |
* Options applied to collections. | |
*/ | |
public function __construct($bundle, array $options = array()) { | |
parent::__construct('field_collection_item', $bundle, $options); | |
$this->hostEntityType = $options['host_entity_type']; | |
} | |
/** | |
* Returns a list of fields available to be mapped for this collection (bundle). | |
* | |
* @return array | |
* Keys: machine names of the fields (to be passed to addFieldMapping). | |
* Values: Human-friendly descriptions of the fields. | |
*/ | |
public function fields() { | |
$fields = migrate_handler_invoke_all('Entity', 'fields', $this->entityType, $this->bundle); | |
$fields['host_entity_id'] = t('Field collection host ID'); | |
return $fields; | |
} | |
/** | |
* Import a single term. | |
* | |
* @param $collection | |
* Collection object to build. Pre-filled with any fields mapped in the migration. | |
* @param $row | |
* Raw source data object - passed through to prepare/complete handlers. | |
* | |
* @return array | |
* Array of key fields (item_id only in this case) of the collection that was saved if | |
* successful. FALSE on failure. | |
*/ | |
public function import(stdClass $collection, stdClass $row) { | |
$entity = entity_create('field_collection_item', array('field_name' => $this->bundle)); | |
$updating = FALSE; | |
// The host entity cannot be reset - we only set it on initial insert | |
$host_entity = entity_load_single($this->hostEntityType, $collection->host_entity_id['destid1']); | |
$entity->setHostEntity($this->hostEntityType, $host_entity); | |
unset($collection->host_entity_id); | |
foreach ((array) $collection as $field => $value) { | |
$entity->{$field} = $value; | |
} | |
$this->prepare($entity, $row); | |
migrate_instrument_start('field_collection_save'); | |
$status = $entity->save(); | |
migrate_instrument_stop('field_collection_save'); | |
// TODO: status doesn't return correct value, so just check the | |
// entity was created. | |
if ($entity->item_id) { | |
$this->complete($entity, $row); | |
if ($updating) { | |
$this->numUpdated++; | |
} | |
else { | |
$this->numCreated++; | |
} | |
return array($entity->item_id); | |
} | |
else { | |
return FALSE; | |
} | |
} | |
/** | |
* Delete a migrated collection. | |
* | |
* @param $key | |
* Array of fields representing the key. | |
*/ | |
public function rollback(array $key) { | |
$item_id = reset($key); | |
$this->prepareRollback($item_id); | |
$field_collection_item = field_collection_item_load($item_id); | |
// If the collection wasn't imported we can't roll it back so check if the | |
// loaded object matches the fieldcollection item class. | |
if ($field_collection_item instanceof FieldCollectionItemEntity) { | |
$field_collection_item->delete(); | |
} | |
$this->completeRollback($item_id); | |
return TRUE; | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment