annotate sites/all/modules/references/references.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 * @file
danielebarchiesi@4 4 * Mapper that handles any fields added by the References module (node_reference, user_reference)
danielebarchiesi@4 5 *
danielebarchiesi@4 6 * Code is effectively a port of the mapper_for_nodereference_field patch to drupal 7, and borrows
danielebarchiesi@4 7 * heavily from the nodereference patch
danielebarchiesi@4 8 *
danielebarchiesi@4 9 */
danielebarchiesi@4 10
danielebarchiesi@4 11 /**
danielebarchiesi@4 12 * Implements hook_feeds_parser_sources_alter().
danielebarchiesi@4 13 */
danielebarchiesi@4 14 function node_reference_feeds_parser_sources_alter(&$sources, $content_type) {
danielebarchiesi@4 15 if (!empty($content_type)) {
danielebarchiesi@4 16 $fields = field_info_fields();
danielebarchiesi@4 17 foreach ($fields as $field) {
danielebarchiesi@4 18 if ($field['type'] == 'node_reference' && isset($field['bundles']['node']) && in_array($content_type, $field['bundles']['node'])) {
danielebarchiesi@4 19 $sources['parent:node_reference:'. $field['field_name']] = array(
danielebarchiesi@4 20 'name' => t('Feed node: Node Reference (nid): @field_name', array('@field_name' => $field['field_name'])),
danielebarchiesi@4 21 'description' => t('Node References from the parent feed node.'),
danielebarchiesi@4 22 'callback' => 'node_reference_feeds_get_source',
danielebarchiesi@4 23 );
danielebarchiesi@4 24 }
danielebarchiesi@4 25 }
danielebarchiesi@4 26 }
danielebarchiesi@4 27 return $sources;
danielebarchiesi@4 28 }
danielebarchiesi@4 29
danielebarchiesi@4 30 /**
danielebarchiesi@4 31 * Callback for mapping parent node references to child node reference values.
danielebarchiesi@4 32 *
danielebarchiesi@4 33 * @param $source
danielebarchiesi@4 34 * A FeedsSource object.
danielebarchiesi@4 35 * @param $result
danielebarchiesi@4 36 * FeedsParserResult object.
danielebarchiesi@4 37 * @param $key
danielebarchiesi@4 38 * The key as defined in the _feeds_parser_sources_alter() hook defined above.
danielebarchiesi@4 39 * @return array
danielebarchiesi@4 40 * The node ids that the parent node references.
danielebarchiesi@4 41 */
danielebarchiesi@4 42 function node_reference_feeds_get_source(FeedsSource $source, FeedsParserResult $result, $key) {
danielebarchiesi@4 43 if ($node = node_load($source->feed_nid)) {
danielebarchiesi@4 44 $results = array();
danielebarchiesi@4 45 $field = substr($key, 22);
danielebarchiesi@4 46 if (!empty($node->{$field}['und'])) {
danielebarchiesi@4 47 foreach ($node->{$field}['und'] as $delta => $value) {
danielebarchiesi@4 48 $results[] = $value['nid'];
danielebarchiesi@4 49 }
danielebarchiesi@4 50 }
danielebarchiesi@4 51 return $results;
danielebarchiesi@4 52 }
danielebarchiesi@4 53 }
danielebarchiesi@4 54
danielebarchiesi@4 55 /**
danielebarchiesi@4 56 * Implements hook_feeds_processor_targets_alter() for node_reference fields
danielebarchiesi@4 57 *
danielebarchiesi@4 58 * @see FeedsNodeProcessor::getMappingTargets().
danielebarchiesi@4 59 */
danielebarchiesi@4 60 function node_reference_feeds_processor_targets_alter(&$targets, $entity_type, $bundle_name) {
danielebarchiesi@4 61 foreach (field_info_instances($entity_type, $bundle_name) as $name => $instance) {
danielebarchiesi@4 62 $info = field_info_field($name);
danielebarchiesi@4 63 if ($info['type'] == 'node_reference') {
danielebarchiesi@4 64
danielebarchiesi@4 65 $targets[$name . ':title'] = array(
danielebarchiesi@4 66 'name' => $instance['label'] . t(' (Node reference by node title)'),
danielebarchiesi@4 67 'callback' => 'references_feeds_set_target',
danielebarchiesi@4 68 'description' => t('The @label field of the node matched by node title.', array('@label' => $instance['label'])),
danielebarchiesi@4 69 'real_target' => $name);
danielebarchiesi@4 70
danielebarchiesi@4 71 $targets[$name . ':nid'] = array(
danielebarchiesi@4 72 'name' => $instance['label'] . t(' (Node reference by node ID)'),
danielebarchiesi@4 73 'callback' => 'references_feeds_set_target',
danielebarchiesi@4 74 'description' => t('The @label field of the node matched by node ID.', array('@label' => $instance['label'])),
danielebarchiesi@4 75 'real_target' => $name);
danielebarchiesi@4 76
danielebarchiesi@4 77 $targets[$name . ':url'] = array(
danielebarchiesi@4 78 'name' => $instance['label'] . t(' (Node reference by Feeds URL)'),
danielebarchiesi@4 79 'callback' => 'references_feeds_set_target',
danielebarchiesi@4 80 'description' => t('The @label field of the node matched by Feeds URL.', array('@label' => $instance['label'])),
danielebarchiesi@4 81 'real_target' => $name);
danielebarchiesi@4 82
danielebarchiesi@4 83 $targets[$name . ':guid'] = array(
danielebarchiesi@4 84 'name' => $instance['label'] . t(' (Node reference by Feeds GUID)'),
danielebarchiesi@4 85 'callback' => 'references_feeds_set_target',
danielebarchiesi@4 86 'description' => t('The @label field of the node matched by Feeds GUID.', array('@label' => $instance['label'])),
danielebarchiesi@4 87 'real_target' => $name);
danielebarchiesi@4 88
danielebarchiesi@4 89 $targets[$name . ':title:duplicates'] = array(
danielebarchiesi@4 90 'name' => $instance['label'] . t(' (Node reference by node title) -- allow duplicate nodes'),
danielebarchiesi@4 91 'callback' => 'references_feeds_set_target',
danielebarchiesi@4 92 'description' => t('The @label field of the node matched by node title. This target allows duplicate nodes (nodes can appear more than once in a field).', array('@label' => $instance['label'])),
danielebarchiesi@4 93 'real_target' => $name);
danielebarchiesi@4 94
danielebarchiesi@4 95 $targets[$name . ':nid:duplicates'] = array(
danielebarchiesi@4 96 'name' => $instance['label'] . t(' (Node reference by node ID) -- allow duplicate nodes'),
danielebarchiesi@4 97 'callback' => 'references_feeds_set_target',
danielebarchiesi@4 98 'description' => t('The @label field of the node matched by node ID. This target allows duplicate nodes (nodes can appear more than once in a field).', array('@label' => $instance['label'])),
danielebarchiesi@4 99 'real_target' => $name);
danielebarchiesi@4 100
danielebarchiesi@4 101 $targets[$name . ':url:duplicates'] = array(
danielebarchiesi@4 102 'name' => $instance['label'] . t(' (Node reference by Feeds URL) -- allow duplicate nodes'),
danielebarchiesi@4 103 'callback' => 'references_feeds_set_target',
danielebarchiesi@4 104 'description' => t('The @label field of the node matched by Feeds URL.', array('@label' => $instance['label'])),
danielebarchiesi@4 105 'real_target' => $name);
danielebarchiesi@4 106
danielebarchiesi@4 107 $targets[$name . ':guid:duplicates'] = array(
danielebarchiesi@4 108 'name' => $instance['label'] . t(' (Node reference by Feeds GUID) -- allow duplicate nodes'),
danielebarchiesi@4 109 'callback' => 'references_feeds_set_target',
danielebarchiesi@4 110 'description' => t('The @label field of the node matched by Feeds GUID.', array('@label' => $instance['label'])),
danielebarchiesi@4 111 'real_target' => $name);
danielebarchiesi@4 112 }
danielebarchiesi@4 113 }
danielebarchiesi@4 114 }
danielebarchiesi@4 115 /**
danielebarchiesi@4 116 * Implements hook_feeds_processor_targets_alter() for user_reference fields
danielebarchiesi@4 117 *
danielebarchiesi@4 118 * @see FeedsNodeProcessor::getMappingTargets().
danielebarchiesi@4 119 *
danielebarchiesi@4 120 */
danielebarchiesi@4 121 function user_reference_feeds_processor_targets_alter(&$targets, $entity_type, $bundle_name) {
danielebarchiesi@4 122 foreach (field_info_instances($entity_type, $bundle_name) as $name => $instance) {
danielebarchiesi@4 123 $info = field_info_field($name);
danielebarchiesi@4 124 if ($info['type'] == 'user_reference') {
danielebarchiesi@4 125
danielebarchiesi@4 126 $targets[$name . ':name'] = array(
danielebarchiesi@4 127 'name' => $instance['label'] . t(' (User reference by user name)'),
danielebarchiesi@4 128 'callback' => 'references_feeds_set_target',
danielebarchiesi@4 129 'description' => t('The @label field of the user matched by user name. ', array('@label' => $instance['label'])),
danielebarchiesi@4 130 'real_target' => $name);
danielebarchiesi@4 131
danielebarchiesi@4 132 $targets[$name . ':uid'] = array(
danielebarchiesi@4 133 'name' => $instance['label'] . t(' (User reference by user ID)'),
danielebarchiesi@4 134 'callback' => 'references_feeds_set_target',
danielebarchiesi@4 135 'description' => t('The @label field of the user matched by user ID.', array('@label' => $instance['label'])),
danielebarchiesi@4 136 'real_target' => $name);
danielebarchiesi@4 137
danielebarchiesi@4 138 $targets[$name . ':url'] = array(
danielebarchiesi@4 139 'name' => $instance['label'] . t(' (User reference by Feeds URL)'),
danielebarchiesi@4 140 'callback' => 'references_feeds_set_target',
danielebarchiesi@4 141 'description' => t('The @label field of the node matched by Feeds URL.', array('@label' => $instance['label'])),
danielebarchiesi@4 142 'real_target' => $name);
danielebarchiesi@4 143
danielebarchiesi@4 144 $targets[$name . ':guid'] = array(
danielebarchiesi@4 145 'name' => $instance['label'] . t(' (User reference by Feeds GUID)'),
danielebarchiesi@4 146 'callback' => 'references_feeds_set_target',
danielebarchiesi@4 147 'description' => t('The @label field of the node matched by Feeds GUID.', array('@label' => $instance['label'])),
danielebarchiesi@4 148 'real_target' => $name);
danielebarchiesi@4 149
danielebarchiesi@4 150 $targets[$name . ':name:duplicates'] = array(
danielebarchiesi@4 151 'name' => $instance['label'] . t(' (User reference by user name) -- allow duplicate users'),
danielebarchiesi@4 152 'callback' => 'references_feeds_set_target',
danielebarchiesi@4 153 'description' => t('The @label field of the user matched by user name. This target allows duplicate users (users can appear more than once in a field).', array('@label' => $instance['label'])),
danielebarchiesi@4 154 'real_target' => $name);
danielebarchiesi@4 155
danielebarchiesi@4 156 $targets[$name . ':uid:duplicates'] = array(
danielebarchiesi@4 157 'name' => $instance['label'] . t(' (User reference by user ID) -- allow duplicate users'),
danielebarchiesi@4 158 'callback' => 'references_feeds_set_target',
danielebarchiesi@4 159 'description' => t('The @label field of the user matched by user ID. This target allows duplicate users (users can appear more than once in a field).', array('@label' => $instance['label'])),
danielebarchiesi@4 160 'real_target' => $name);
danielebarchiesi@4 161
danielebarchiesi@4 162 $targets[$name . ':url:duplicates'] = array(
danielebarchiesi@4 163 'name' => $instance['label'] . t(' (User reference by Feeds URL) -- allow duplicate users'),
danielebarchiesi@4 164 'callback' => 'references_feeds_set_target',
danielebarchiesi@4 165 'description' => t('The @label field of the node matched by Feeds URL.', array('@label' => $instance['label'])),
danielebarchiesi@4 166 'real_target' => $name);
danielebarchiesi@4 167
danielebarchiesi@4 168 $targets[$name . ':guid:duplicates'] = array(
danielebarchiesi@4 169 'name' => $instance['label'] . t(' (User reference by Feeds GUID) -- allow duplicate users'),
danielebarchiesi@4 170 'callback' => 'references_feeds_set_target',
danielebarchiesi@4 171 'description' => t('The @label field of the node matched by Feeds GUID.', array('@label' => $instance['label'])),
danielebarchiesi@4 172 'real_target' => $name);
danielebarchiesi@4 173 }
danielebarchiesi@4 174 }
danielebarchiesi@4 175 }
danielebarchiesi@4 176
danielebarchiesi@4 177 /**
danielebarchiesi@4 178 * Callback for mapping both node reference and user_reference fields
danielebarchiesi@4 179 *
danielebarchiesi@4 180 * Implementation of hook_feeds_set_target().
danielebarchiesi@4 181 *
danielebarchiesi@4 182 * @param $source
danielebarchiesi@4 183 * A FeedsSource object.
danielebarchiesi@4 184 * @param $entity
danielebarchiesi@4 185 * The entity to map to.
danielebarchiesi@4 186 * @param $target
danielebarchiesi@4 187 * The target key on $entity to map to.
danielebarchiesi@4 188 * @param $value
danielebarchiesi@4 189 * The value to map. Can be an array or a string.
danielebarchiesi@4 190 */
danielebarchiesi@4 191 function references_feeds_set_target($source, $entity, $target, $value) {
danielebarchiesi@4 192 if (empty($value)) {
danielebarchiesi@4 193 return;
danielebarchiesi@4 194 }
danielebarchiesi@4 195
danielebarchiesi@4 196 // Handle comma delimited or non-multiple values.
danielebarchiesi@4 197 if (!is_array($value)) {
danielebarchiesi@4 198 $value = array($value);
danielebarchiesi@4 199 }
danielebarchiesi@4 200
danielebarchiesi@4 201 // Determine the field we are matching against, and whether duplicates are allowed.
danielebarchiesi@4 202 $target_info = explode(':', $target, 3);
danielebarchiesi@4 203 if (sizeof($target_info) == 3) {
danielebarchiesi@4 204 list($target, $match_key, $duplicates) = $target_info;
danielebarchiesi@4 205 }
danielebarchiesi@4 206 else {
danielebarchiesi@4 207 list($target, $match_key) = $target_info;
danielebarchiesi@4 208 }
danielebarchiesi@4 209
danielebarchiesi@4 210 // Load field definition.
danielebarchiesi@4 211 $info = field_info_field($target);
danielebarchiesi@4 212 // Parameters to handle differences between node references and user references
danielebarchiesi@4 213 if ($info['type'] == 'user_reference') {
danielebarchiesi@4 214 $idname = 'uid';
danielebarchiesi@4 215 $typename = 'user';
danielebarchiesi@4 216 $validate_function = 'user_reference_potential_references';
danielebarchiesi@4 217 }
danielebarchiesi@4 218 else {
danielebarchiesi@4 219 $idname = 'nid';
danielebarchiesi@4 220 $typename = 'node';
danielebarchiesi@4 221 $validate_function = 'node_reference_potential_references';
danielebarchiesi@4 222 }
danielebarchiesi@4 223
danielebarchiesi@4 224 $field = isset($entity->$target) ? $entity->$target : array();
danielebarchiesi@4 225 if (!isset($field['und'])) {
danielebarchiesi@4 226 $field['und'] = array();
danielebarchiesi@4 227 }
danielebarchiesi@4 228
danielebarchiesi@4 229 // Match values against nodes and add to field.
danielebarchiesi@4 230 foreach ($value as $v) {
danielebarchiesi@4 231 // Create options.
danielebarchiesi@4 232 $options = array(
danielebarchiesi@4 233 'string' => $v,
danielebarchiesi@4 234 'match' => 'equals',
danielebarchiesi@4 235 'ids' => array(),
danielebarchiesi@4 236 'limit' => 1,
danielebarchiesi@4 237 );
danielebarchiesi@4 238
danielebarchiesi@4 239 switch ($match_key) {
danielebarchiesi@4 240 case 'title':
danielebarchiesi@4 241 case 'name':
danielebarchiesi@4 242 // Validate node title or user name.
danielebarchiesi@4 243 if ((is_string($options['string']) && $options['string'] != '') || is_numeric($options['string'])) {
danielebarchiesi@4 244 // Lookup potential exact matches for the value (limit to one result).
danielebarchiesi@4 245 $matches = $validate_function($info,$options);
danielebarchiesi@4 246 // Use the first element of the potential matches.
danielebarchiesi@4 247 $options['ids']= key($matches);
danielebarchiesi@4 248 }
danielebarchiesi@4 249
danielebarchiesi@4 250 // Alert if no match is found.
danielebarchiesi@4 251 if (empty($options['ids'])) {
danielebarchiesi@4 252 drupal_set_message(t('%title does not match an existing '.$typename, array('%title' => $options['string'])));
danielebarchiesi@4 253 }
danielebarchiesi@4 254 break;
danielebarchiesi@4 255
danielebarchiesi@4 256 case 'nid':
danielebarchiesi@4 257 case 'uid':
danielebarchiesi@4 258 // Make sure it is a positive integer.
danielebarchiesi@4 259 if ((is_int($options['string']) || ctype_digit($options['string'])) && $options['string'] > 0 && $options['string'] !== '') {
danielebarchiesi@4 260 // Make sure it is a valid node id or user id for this field.
danielebarchiesi@4 261 $matches = $validate_function($info, array($options['string']));
danielebarchiesi@4 262 foreach ($matches as $k => $v) {
danielebarchiesi@4 263 if ($options['string'] == $k) {
danielebarchiesi@4 264 $options['ids'] = $k;
danielebarchiesi@4 265 }
danielebarchiesi@4 266 }
danielebarchiesi@4 267 }
danielebarchiesi@4 268
danielebarchiesi@4 269 // Alert if no match is found.
danielebarchiesi@4 270 if (empty($options['ids'])) {
danielebarchiesi@4 271 drupal_set_message(t('%id is not a valid '.$typename.' id for this field.', array('%id' => $options['string'])));
danielebarchiesi@4 272 }
danielebarchiesi@4 273 break;
danielebarchiesi@4 274
danielebarchiesi@4 275 case 'guid':
danielebarchiesi@4 276 case 'url':
danielebarchiesi@4 277 // get the value from table feeds-item.
danielebarchiesi@4 278 $result = db_query('SELECT f.entity_id FROM {feeds_item} f WHERE f.'.$match_key.' = :v', array( ':v' => $v) );
danielebarchiesi@4 279 $options['ids'] = $result->fetchField();
danielebarchiesi@4 280
danielebarchiesi@4 281 // Alert if no match is found.
danielebarchiesi@4 282 if (empty($options['ids'])) {
danielebarchiesi@4 283 drupal_set_message(t('%id is not a valid '.$typename.' id for this field.', array('%id' => $v)));
danielebarchiesi@4 284 }
danielebarchiesi@4 285 break;
danielebarchiesi@4 286 }
danielebarchiesi@4 287
danielebarchiesi@4 288 if (!empty($options['ids'])) {
danielebarchiesi@4 289 $reference = array($idname => $options['ids']);
danielebarchiesi@4 290 if (!empty($duplicates)) {
danielebarchiesi@4 291 // Add the reference, ignoring duplicates.
danielebarchiesi@4 292 $field['und'][] = $reference;
danielebarchiesi@4 293 }
danielebarchiesi@4 294 else if (!in_array($reference, $field['und'])) {
danielebarchiesi@4 295 // Add the reference only if it doesn't already exist.
danielebarchiesi@4 296 $field['und'][] = $reference;
danielebarchiesi@4 297 }
danielebarchiesi@4 298
danielebarchiesi@4 299 if ($info['cardinality'] == 1) {
danielebarchiesi@4 300 break;
danielebarchiesi@4 301 }
danielebarchiesi@4 302 }
danielebarchiesi@4 303 }
danielebarchiesi@4 304 $entity->{$target} = $field;
danielebarchiesi@4 305 }