diff --git a/feeds_ui/feeds_ui.admin.inc b/feeds_ui/feeds_ui.admin.inc index a8e1bfb..a8c3163 100644 --- a/feeds_ui/feeds_ui.admin.inc +++ b/feeds_ui/feeds_ui.admin.inc @@ -560,6 +560,15 @@ function feeds_ui_mapping_form($form, &$form_state, $importer) { '#type' => 'select', '#options' => array('' => t('Select a target')) + $target_options, ); + + if (module_exists('locale')) { + $form['language'] = array( + '#type' => 'select', + '#options' => array(LANGUAGE_NONE => t('All languages')) + locale_language_list('name'), + '#default_value' => LANGUAGE_NONE, + ); + } + $form['add'] = array( '#type' => 'submit', '#value' => t('Add'), @@ -570,6 +579,7 @@ function feeds_ui_mapping_form($form, &$form_state, $importer) { '#value' => t('Save'), '#attributes' => array('class' => array('feeds-ui-hidden-submit')), ); + return $form; } @@ -584,7 +594,9 @@ function feeds_ui_mapping_form_add_submit($form, &$form_state) { 'source' => $form_state['values']['source'], 'target' => $form_state['values']['target'], 'unique' => FALSE, + 'language' => isset($form_state['values']['language']) ? $form_state['values']['language'] : LANGUAGE_NONE, ); + $importer->processor->addConfig(array('mappings' => $mappings)); $importer->processor->save(); drupal_set_message(t('Mapping has been added.')); @@ -778,6 +790,7 @@ function theme_feeds_ui_mapping_form($variables) { $header = array( t('Source'), t('Target'), + t('Language'), t('Unique target'), ' ', ); @@ -787,9 +800,17 @@ function theme_feeds_ui_mapping_form($variables) { // Some parsers do not define source options. $source = isset($form['source']['#options'][$mapping['source']]) ? $form['source']['#options'][$mapping['source']] : $mapping['source']; $target = isset($form['target']['#options'][$mapping['target']]) ? check_plain($form['target']['#options'][$mapping['target']]) : '' . t('Missing') . ''; + if (isset($form['language'])) { + $language = isset($form['language']['#options'][$mapping['language']]) ? check_plain($form['language']['#options'][$mapping['language']]) : '' . t('All languages') . ''; + } + else { + $language = '' . t('All languages') . ''; + } + $rows[] = array( check_plain($source), $target, + $language, drupal_render($form['unique_flags'][$i]), drupal_render($form['remove_flags'][$i]), ); @@ -806,6 +827,7 @@ function theme_feeds_ui_mapping_form($variables) { $rows[] = array( drupal_render($form['source']), drupal_render($form['target']), + drupal_render($form['language']), '', drupal_render($form['add']), ); diff --git a/mappers/date.inc b/mappers/date.inc index 19aa65d..981ba0e 100644 --- a/mappers/date.inc +++ b/mappers/date.inc @@ -46,7 +46,7 @@ function date_feeds_processor_targets_alter(&$targets, $entity_type, $bundle_nam * * @todo Support array of values for dates. */ -function date_feeds_set_target($source, $entity, $target, $feed_element) { +function date_feeds_set_target($source, $entity, $target, $feed_element, $mapping) { list($field_name, $sub_field) = explode(':', $target, 2); if (!($feed_element instanceof FeedsDateTimeElement)) { if (is_array($feed_element)) { diff --git a/mappers/field.inc b/mappers/field.inc index c6cf999..c27b493 100644 --- a/mappers/field.inc +++ b/mappers/field.inc @@ -53,7 +53,7 @@ function field_feeds_processor_targets_alter(&$targets, $entity_type, $bundle_na * * Ensure that $value is a numeric to avoid database errors. */ -function field_feeds_set_target_numeric($source, $entity, $target, $value) { +function field_feeds_set_target_numeric($source, $entity, $target, $value, $mapping) { if (!is_array($value)) { $value = array($value); } @@ -62,17 +62,17 @@ function field_feeds_set_target_numeric($source, $entity, $target, $value) { unset($value[$k]); } } - _field_feeds_set_target($source, $entity, $target, $value, FALSE); + _field_feeds_set_target($source, $entity, $target, $value, $mapping, FALSE); } /** * Callback for mapping text fields. */ -function field_feeds_set_target_text($source, $entity, $target, $value) { +function field_feeds_set_target_text($source, $entity, $target, $value, $mapping) { if (!is_array($value)) { $value = array($value); } - _field_feeds_set_target($source, $entity, $target, $value, TRUE); + _field_feeds_set_target($source, $entity, $target, $value, $mapping, TRUE); } /** @@ -90,10 +90,12 @@ function field_feeds_set_target_text($source, $entity, $target, $value) { * The target key on $entity to map to. * @param $value * The value to map. MUST be an array. + * @param $mapping + * Array of mapping settings for current value. * @param $input_format * TRUE if an input format should be applied. */ -function _field_feeds_set_target($source, $entity, $target, $value, $input_format = FALSE) { +function _field_feeds_set_target($source, $entity, $target, $value, $mapping, $input_format = FALSE) { if (empty($value)) { return; } @@ -103,19 +105,22 @@ function _field_feeds_set_target($source, $entity, $target, $value, $input_forma $format = $source->importer->processor->config['input_format']; } } - + $info = field_info_field($target); + // Set the language of the field depending on the mapping. + $language = isset($mapping['language']) ? $mapping['language'] : LANGUAGE_NONE; + // Iterate over all values. $i = 0; $field = isset($entity->$target) ? $entity->$target : array(); foreach ($value as $v) { if (!is_array($v) && !is_object($v)) { - $field['und'][$i]['value'] = $v; + $field[$language][$i]['value'] = $v; } if ($input_format) { if (isset($format)) { - $field['und'][$i]['format'] = $format; + $field[$language][$i]['format'] = $format; } } if ($info['cardinality'] == 1) { diff --git a/mappers/file.inc b/mappers/file.inc index 1439ab0..aeff60f 100644 --- a/mappers/file.inc +++ b/mappers/file.inc @@ -36,7 +36,7 @@ function file_feeds_processor_targets_alter(&$targets, $entity_type, $bundle_nam * user has decided to map to and $value contains the value of the feed item * element the user has picked as a source. */ -function file_feeds_set_target($source, $entity, $target, $value) { +function file_feeds_set_target($source, $entity, $target, $value, $mapping) { if (empty($value)) { return; } @@ -60,6 +60,9 @@ function file_feeds_set_target($source, $entity, $target, $value) { return; } + // Set the language of the field depending on the mapping. + $language = isset($mapping['language']) ? $mapping['language'] : LANGUAGE_NONE; + // Determine file destination. // @todo This needs review and debugging. list($entity_id, $vid, $bundle_name) = entity_extract_ids($entity->feeds_item->entity_type, $entity); @@ -76,8 +79,8 @@ function file_feeds_set_target($source, $entity, $target, $value) { $field = isset($entity->$target) ? $entity->$target : array(); foreach ($value as $v) { if ($file = $v->getFile($destination)) { - $field['und'][$i] = (array)$file; - $field['und'][$i]['display'] = 1; // @todo: Figure out how to properly populate this field. + $field[$language][$i] = (array)$file; + $field[$language][$i]['display'] = 1; // @todo: Figure out how to properly populate this field. if ($info['cardinality'] == 1) { break; } diff --git a/mappers/link.inc b/mappers/link.inc index 5629da8..fa57a02 100644 --- a/mappers/link.inc +++ b/mappers/link.inc @@ -39,7 +39,7 @@ function link_feeds_processor_targets_alter(&$targets, $entity_type, $bundle_nam * user has decided to map to and $value contains the value of the feed item * element the user has picked as a source. */ -function link_feeds_set_target($source, $entity, $target, $value) { +function link_feeds_set_target($source, $entity, $target, $value, $mapping) { if (empty($value)) { return; } @@ -49,6 +49,9 @@ function link_feeds_set_target($source, $entity, $target, $value) { $value = array($value); } + // Set the language of the field depending on the mapping. + $language = isset($mapping['language']) ? $mapping['language'] : LANGUAGE_NONE; + // Iterate over all values. $i = 0; $info = field_info_field($target); @@ -57,15 +60,15 @@ function link_feeds_set_target($source, $entity, $target, $value) { if (!is_array($v) && !is_object($v)) { if (strstr($target, 'url')) { if(isset($entity->{$field_name}['und'][$i]['title'])) { - $field['und'][$i]['title'] = $entity->{$field_name}['und'][$i]['title']; + $field[$language][$i]['title'] = $entity->{$field_name}['und'][$i]['title']; } - $field['und'][$i]['url'] = $v; + $field[$language][$i]['url'] = $v; } elseif (strstr($target, 'title')) { if(isset($entity->{$field_name}['und'][$i]['url'])) { - $field['und'][$i]['url'] = $entity->{$field_name}['und'][$i]['url']; + $field[$language][$i]['url'] = $entity->{$field_name}['und'][$i]['url']; } - $field['und'][$i]['title'] = $v; + $field[$language][$i]['title'] = $v; } } if ($info['cardinality'] == 1) { diff --git a/mappers/taxonomy.inc b/mappers/taxonomy.inc index 01d92f3..d7424ce 100644 --- a/mappers/taxonomy.inc +++ b/mappers/taxonomy.inc @@ -61,7 +61,7 @@ function taxonomy_feeds_processor_targets_alter(&$targets, $entity_type, $bundle * * @todo Do not create new terms for non-autotag fields. */ -function taxonomy_feeds_set_target($source, $entity, $target, $terms) { +function taxonomy_feeds_set_target($source, $entity, $target, $terms, $mapping) { if (empty($terms)) { return; } @@ -71,6 +71,9 @@ function taxonomy_feeds_set_target($source, $entity, $target, $terms) { $terms = array($terms); } + // Set the language of the field depending on the mapping. + $language = isset($mapping['language']) ? $mapping['language'] : LANGUAGE_NONE; + $info = field_info_field($target); // See http://drupal.org/node/881530 @@ -95,7 +98,7 @@ function taxonomy_feeds_set_target($source, $entity, $target, $terms) { $tid = taxonomy_term_check_term($term, $vocabulary->vid); } if ($tid) { - $entity->{$target}['und'][$i]['tid'] = $tid; + $entity->{$target}[$language][$i]['tid'] = $tid; } if ($info['cardinality'] == 1) { diff --git a/plugins/FeedsProcessor.inc b/plugins/FeedsProcessor.inc index f283d97..8313fb3 100644 --- a/plugins/FeedsProcessor.inc +++ b/plugins/FeedsProcessor.inc @@ -395,10 +395,10 @@ abstract class FeedsProcessor extends FeedsPlugin { isset($targets[$this->id][$mapping['target']]['callback']) && function_exists($targets[$this->id][$mapping['target']]['callback'])) { $callback = $targets[$this->id][$mapping['target']]['callback']; - $callback($source, $target_item, $mapping['target'], $value); + $callback($source, $target_item, $mapping['target'], $value, $mapping); } else { - $this->setTargetElement($source, $target_item, $mapping['target'], $value); + $this->setTargetElement($source, $target_item, $mapping['target'], $value, $mapping); } } return $target_item;