annotate sites/all/modules/entityreference/entityreference.feeds.inc @ 4:ce11bbd8f642

added modules
author danieleb <danielebarchiesi@me.com>
date Thu, 19 Sep 2013 10:38:44 +0100
parents
children
rev   line source
danielebarchiesi@4 1 <?php
danielebarchiesi@4 2
danielebarchiesi@4 3 /**
danielebarchiesi@4 4 * @file
danielebarchiesi@4 5 * Feeds mapping implementation for the Entity reference module
danielebarchiesi@4 6 */
danielebarchiesi@4 7
danielebarchiesi@4 8 /**
danielebarchiesi@4 9 * Implements hook_feeds_processor_targets_alter().
danielebarchiesi@4 10 *
danielebarchiesi@4 11 * @see FeedsNodeProcessor::getMappingTargets().
danielebarchiesi@4 12 */
danielebarchiesi@4 13 function entityreference_feeds_processor_targets_alter(&$targets, $entity_type, $bundle_name) {
danielebarchiesi@4 14
danielebarchiesi@4 15 foreach (field_info_instances($entity_type, $bundle_name) as $name => $instance) {
danielebarchiesi@4 16 $info = field_info_field($name);
danielebarchiesi@4 17 if ($info['type'] == 'entityreference') {
danielebarchiesi@4 18 $targets[$name] = array(
danielebarchiesi@4 19 'name' => check_plain($instance['label']),
danielebarchiesi@4 20 'callback' => 'entityreference_feeds_set_target',
danielebarchiesi@4 21 'description' => t('The field instance @label of @id', array(
danielebarchiesi@4 22 '@label' => $instance['label'],
danielebarchiesi@4 23 '@id' => $name,
danielebarchiesi@4 24 )),
danielebarchiesi@4 25 );
danielebarchiesi@4 26 }
danielebarchiesi@4 27 }
danielebarchiesi@4 28 }
danielebarchiesi@4 29
danielebarchiesi@4 30 /**
danielebarchiesi@4 31 * Entity reference callback for mapping.
danielebarchiesi@4 32 *
danielebarchiesi@4 33 * When the callback is invoked, $target contains the name of the field the
danielebarchiesi@4 34 * user has decided to map to and $value contains the value of the feed item
danielebarchiesi@4 35 * element the user has picked as a source.
danielebarchiesi@4 36 *
danielebarchiesi@4 37 * @param $source
danielebarchiesi@4 38 * A FeedsSource object.
danielebarchiesi@4 39 * @param $entity
danielebarchiesi@4 40 * The entity to map to.
danielebarchiesi@4 41 * @param $target
danielebarchiesi@4 42 * The target key on $entity to map to.
danielebarchiesi@4 43 * @param $value
danielebarchiesi@4 44 * The value to map. MUST be an array.
danielebarchiesi@4 45 * @param $mapping
danielebarchiesi@4 46 * Array of mapping settings for current value.
danielebarchiesi@4 47 * @param $input_format
danielebarchiesi@4 48 * TRUE if an input format should be applied.
danielebarchiesi@4 49 */
danielebarchiesi@4 50 function entityreference_feeds_set_target($source, $entity, $target, $value, $mapping, $input_format = FALSE) {
danielebarchiesi@4 51
danielebarchiesi@4 52 // Don't do anything if we weren't given any data.
danielebarchiesi@4 53 if (empty($value)) {
danielebarchiesi@4 54 return;
danielebarchiesi@4 55 }
danielebarchiesi@4 56
danielebarchiesi@4 57 // Assume that the passed in value could really be any number of values.
danielebarchiesi@4 58 if (is_array($value)) {
danielebarchiesi@4 59 $values = $value;
danielebarchiesi@4 60 }
danielebarchiesi@4 61 else {
danielebarchiesi@4 62 $values = array($value);
danielebarchiesi@4 63 }
danielebarchiesi@4 64
danielebarchiesi@4 65 // Get some useful field information.
danielebarchiesi@4 66 $info = field_info_field($target);
danielebarchiesi@4 67
danielebarchiesi@4 68 // Set the language of the field depending on the mapping.
danielebarchiesi@4 69 $language = isset($mapping['language']) ? $mapping['language'] : LANGUAGE_NONE;
danielebarchiesi@4 70
danielebarchiesi@4 71 // Iterate over all values.
danielebarchiesi@4 72 $iterator = 0;
danielebarchiesi@4 73 $field = isset($entity->$target) ? $entity->$target : array();
danielebarchiesi@4 74 foreach ($values as $value) {
danielebarchiesi@4 75
danielebarchiesi@4 76 // Only process if this value was set for this instance.
danielebarchiesi@4 77 if ($value) {
danielebarchiesi@4 78
danielebarchiesi@4 79 // Fetch the entity ID resulting from the mapping table look-up.
danielebarchiesi@4 80 $entity_id = db_query(
danielebarchiesi@4 81 'SELECT entity_id FROM {feeds_item} WHERE guid = :guid',
danielebarchiesi@4 82 array(':guid' => $value)
danielebarchiesi@4 83 )->fetchField();
danielebarchiesi@4 84
danielebarchiesi@4 85 /*
danielebarchiesi@4 86 * Only add a reference to an existing entity ID if there exists a
danielebarchiesi@4 87 * mapping between it and the provided GUID. In cases where no such
danielebarchiesi@4 88 * mapping exists (yet), don't do anything here. There may be a mapping
danielebarchiesi@4 89 * defined later in the CSV file. If so, and the user re-runs the import
danielebarchiesi@4 90 * (as a second pass), we can add this reference then. (The "Update
danielebarchiesi@4 91 * existing nodes" option must be selected during the second pass.)
danielebarchiesi@4 92 */
danielebarchiesi@4 93 if ($entity_id) {
danielebarchiesi@4 94
danielebarchiesi@4 95 // Assign the target ID.
danielebarchiesi@4 96 $field[$language][$iterator]['target_id'] = $entity_id;
danielebarchiesi@4 97 }
danielebarchiesi@4 98 else /* there is no $entity_id, no mapping */ {
danielebarchiesi@4 99
danielebarchiesi@4 100 /*
danielebarchiesi@4 101 * Feeds stores a hash of every line imported from CSVs in order to
danielebarchiesi@4 102 * make the import process more efficient by ignoring lines it's
danielebarchiesi@4 103 * already seen. We need to short-circuit this process in this case
danielebarchiesi@4 104 * because users may want to re-import the same line as an update later
danielebarchiesi@4 105 * when (and if) a map to a reference exists. So in order to provide
danielebarchiesi@4 106 * this opportunity later, we need to destroy the hash.
danielebarchiesi@4 107 */
danielebarchiesi@4 108 unset($entity->feeds_item->hash);
danielebarchiesi@4 109 }
danielebarchiesi@4 110 }
danielebarchiesi@4 111
danielebarchiesi@4 112 // Break out of the loop if this field is single-valued.
danielebarchiesi@4 113 if ($info['cardinality'] == 1) {
danielebarchiesi@4 114 break;
danielebarchiesi@4 115 }
danielebarchiesi@4 116 $iterator++;
danielebarchiesi@4 117 }
danielebarchiesi@4 118
danielebarchiesi@4 119 // Add the field to the entity definition.
danielebarchiesi@4 120 $entity->{$target} = $field;
danielebarchiesi@4 121 }