You are here

function entityreference_feeds_entity_presave in Entity reference feeds 7

Implements hook_entity_presave().

File

./entityreference_feeds.module, line 306
This is the main module file for entity reference feeds.

Code

function entityreference_feeds_entity_presave($entity, $type) {

  // @todo: job queue integration for async batching?
  static $property_info = array();
  if (isset($entity->entityreference_feeds_items)) {
    $mapped_targets = entityreference_feeds_processor_mapped_targets($entity->entityreference_feeds_source_id);
    foreach ($entity->entityreference_feeds_items as $field_name => $target_bundles) {

      // Get some useful field information.
      $info = field_info_field($field_name);
      $target_type = $info['settings']['target_type'];
      $field = array();
      foreach ($target_bundles as $target_bundle => $values) {

        //Used for metadata retrieval only
        if (!isset($property_info[$target_type][$target_bundle])) {
          if (!isset($property_info[$target_type])) {
            $property_info[$target_type] = array();
          }
          $metadata_wrapper = entity_metadata_wrapper($target_type, NULL, array(
            'bundle' => $target_bundle,
          ));
          $property_info[$target_type][$target_bundle] = $metadata_wrapper
            ->getPropertyInfo();
        }
        $targets = _entityreference_feeds_get_targets($field_name, $type, $target_bundle);
        foreach ($values as $value) {

          //TODO: This variable name is confusing! $partial_target_entity?
          $item = $value['target_entity'];

          // @todo load multiple?
          // @todo support other unique fields?
          // GUID is a requirement, else we will keep adding new entities on every update.
          if (!empty($item->feeds_item->guid)) {

            // Set aside feeds_item.
            $feeds_item = $item->feeds_item;
            unset($item->feeds_item);

            // Fetch the entity ID resulting from the mapping table look-up.
            // Clone query?
            $entity_id = db_query('SELECT entity_id FROM {feeds_item} WHERE guid = :guid', array(
              ':guid' => $feeds_item->guid,
            ))
              ->fetchField();

            // @todo try catch?
            if ($entity_id) {
              $target_entity = entity_load_single($target_type, $entity_id);
              foreach ($mapped_targets as $target) {
                if (isset($targets[$target])) {
                  $real_target = NULL;
                  if (isset($targets[$target]['real_target'])) {

                    //TODO: How is this used?
                    $real_target = $targets[$target]['real_target'];
                  }
                  else {
                    list($real_target) = explode(':', $target, 2);
                  }
                  if (isset($property_info[$target_type][$target_bundle][$real_target]) && isset($property_info[$target_type][$target_bundle][$real_target]['field']) && $property_info[$target_type][$target_bundle][$real_target]['field']) {

                    // is a field
                    $target_entity->{$real_target} = array(
                      'und' => array(),
                    );
                  }
                  else {
                    unset($target_entity->{$real_target});
                  }
                }
              }
              $wrapper = entity_metadata_wrapper($target_type, $target_entity);
              foreach ($value['creation_values'] as $target_element => $value) {
                $wrapper->{$target_element}
                  ->set($value);
              }
            }
            else {
              $target_entity = _entityreference_feeds_create_entity($target_type, $target_bundle, $value['creation_values']);
            }
            foreach (get_object_vars($item) as $target_element => $target_value) {
              $target_entity->{$target_element} = $target_value;
            }
            entity_save($target_type, $target_entity);
            list($entity_id) = entity_extract_ids($target_type, $target_entity);

            // Restore and save feeds_item.
            $target_entity->feeds_item = $feeds_item;
            feeds_item_info_save($target_entity, $entity_id);

            // Assign the target type and the target ID.
            $field_item = array(
              'target_type' => $target_type,
              'target_id' => $entity_id,
            );

            // Set the language of the field depending on entity language.
            $language = isset($item->language) ? $item->language : LANGUAGE_NONE;
            if (!isset($field[$language])) {
              $field[$language] = array();
            }
            $field[$language][] = $field_item;
          }
        }
      }
      $entity->{$field_name} = $field;
    }
  }
}