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;
}
}
}