You are here

public function MigrationDataImport::attachFieldCollection in CRM Core 7

Attach FC item to host entity.

Parameters

object $entity: Imported entity.

object $row: Data to import.

string $collection_item: Name of the FC item.

array $collection_mapping: Mapping of the FC entity.

string $main_source_field: Name of the main field in source.

1 call to MigrationDataImport::attachFieldCollection()
MigrationDataImport::complete in modules/crm_core_data_import/includes/controllers/MigrationDataImport.inc
Complete callback for each item.

File

modules/crm_core_data_import/includes/controllers/MigrationDataImport.inc, line 376
Handler for migration process.

Class

MigrationDataImport
@file Handler for migration process.

Code

public function attachFieldCollection(&$entity, &$row, $collection_item, $collection_mapping, $main_source_field) {
  if (!empty($row->{$main_source_field . '_collection'})) {
    foreach ($row->{$main_source_field . '_collection'} as $collection_value) {
      try {

        // Create FC entity.
        $collection_entity = entity_create('field_collection_item', array(
          'field_name' => $collection_item,
        ));
        $collection_entity_wrapper = entity_metadata_wrapper('field_collection_item', $collection_entity);
        $collection_entity
          ->setHostEntity($this
          ->getEntityType(), $entity);

        // Add values according to mapping.
        foreach ($collection_mapping as $mapping_item) {
          $value = '';

          // Process default value.
          if ($mapping_item['source']['type'] == 'default_value') {

            // Set default value.
            $value = $mapping_item['destination']['default_value'];
          }
          elseif (isset($collection_value[$mapping_item['source']['sub_field']])) {

            // Set field value from source.
            $value = $collection_value[$mapping_item['source']['sub_field']];
          }
          if (empty($value) && !empty($mapping_item['destination']['default_value'])) {

            // Set default value if source value is empty.
            $value = $mapping_item['destination']['default_value'];
          }
          if (!empty($value) && isset($mapping_item['destination']['sub_field'])) {
            $field_name = $mapping_item['destination']['sub_field'];
            if (!empty($mapping_item['destination']['part'])) {

              // If field is part, just attach to existing entity.
              $collection_entity_wrapper->{$field_name}->{$mapping_item['destination']['part']}
                ->set($value);
            }
            else {

              // Process field with MigrateFieldHandler.
              $field_info = field_info_field($field_name);
              $field_instance = field_info_instance('field_collection_item', $field_name, $collection_item);
              $value = migrate_field_handler_invoke_all($collection_entity, $field_info, $field_instance, array(
                $value,
              ));
              $collection_entity->{$field_name} = $value;
            }
          }
        }
        $collection_entity
          ->save();
      } catch (Exception $e) {
        watchdog('crm_core_data_import', $e
          ->getMessage(), array(), WATCHDOG_ERROR);
      }
    }
  }
}