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