diff --git a/feeds_ui/feeds_ui.admin.inc b/feeds_ui/feeds_ui.admin.inc index 779b070..c143f5a 100644 --- a/feeds_ui/feeds_ui.admin.inc +++ b/feeds_ui/feeds_ui.admin.inc @@ -565,6 +565,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'), @@ -575,6 +584,7 @@ function feeds_ui_mapping_form($form, &$form_state, $importer) { '#value' => t('Save'), '#attributes' => array('class' => array('feeds-ui-hidden-submit')), ); + return $form; } @@ -589,7 +599,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.')); @@ -783,6 +795,7 @@ function theme_feeds_ui_mapping_form($variables) { $header = array( t('Source'), t('Target'), + t('Language'), t('Unique target'), ' ', ); @@ -792,9 +805,15 @@ 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($mapping['language'])) { + $mapping['language'] = LANGUAGE_NONE; + } + $language = isset($form['language']['#options'][$mapping['language']]) ? check_plain($form['language']['#options'][$mapping['language']]) : '' . t('All languages') . ''; + $rows[] = array( check_plain($source), $target, + $language, drupal_render($form['unique_flags'][$i]), drupal_render($form['remove_flags'][$i]), ); @@ -811,6 +830,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 6cc5bca..451ff93 100644 --- a/mappers/date.inc +++ b/mappers/date.inc @@ -45,7 +45,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 43d62c4..5e4581a 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 63c1e2d..ae8003b 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 029b795..02e290f 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 90e4ef8..6f7a826 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 @@ -92,10 +95,15 @@ function taxonomy_feeds_set_target($source, $entity, $target, $terms) { $tid = $term; } elseif (is_string($term)) { - $tid = taxonomy_term_check_term($term, $vocabulary->vid); + if ($vocabulary->i18n_mode == I18N_MODE_TRANSLATE) { + $tid = taxonomy_term_check_term($term, $vocabulary->vid, $language); + } + else { + $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) { @@ -113,17 +121,22 @@ function taxonomy_feeds_set_target($source, $entity, $target, $terms) { * A term name. * @param $vid * A vocabulary id. + * @param $language + * The language code for the term, if it needs to be taken into account for the check. * * @return * A term id. */ -function taxonomy_term_check_term($name, $vid) { +function taxonomy_term_check_term($name, $vid, $language = NULL) { $name = trim($name); - $term = taxonomy_term_lookup_term($name, $vid); + $term = taxonomy_term_lookup_term($name, $vid, $language); if (empty($term)) { $term = new stdClass(); $term->name = $name; $term->vid = $vid; + if (isset($language)) { + $term->language = $language; + } taxonomy_term_save($term); return $term->tid; } @@ -133,11 +146,14 @@ function taxonomy_term_check_term($name, $vid) { /** * Looks up a term, assumes SQL storage backend. */ -function taxonomy_term_lookup_term($name, $vid) { - return db_select('taxonomy_term_data', 'td') +function taxonomy_term_lookup_term($name, $vid, $language = NULL) { + $qry = db_select('taxonomy_term_data', 'td') ->fields('td', array('tid', 'name')) ->condition('name', $name) - ->condition('vid', $vid) - ->execute() + ->condition('vid', $vid); + if (isset($language)) { + $qry->condition('language', $language); + } + return $qry->execute() ->fetchObject(); } diff --git a/plugins/FeedsProcessor.inc b/plugins/FeedsProcessor.inc index 97b6269..9ba69a3 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;