Index: sites/all/modules/feeds/plugins/FeedsParser.inc =================================================================== --- sites/all/modules/feeds/plugins/FeedsParser.inc (revision 4030) +++ sites/all/modules/feeds/plugins/FeedsParser.inc (working copy) @@ -85,7 +85,7 @@ return $node->uid; } $item = $batch->currentItem(); - return isset($item[$element_key]) ? $item[$element_key] : ''; + return !empty($item[$element_key]) ? $item[$element_key] : NULL; } } Index: sites/all/modules/feeds/plugins/FeedsProcessor.inc =================================================================== --- sites/all/modules/feeds/plugins/FeedsProcessor.inc (revision 4030) +++ sites/all/modules/feeds/plugins/FeedsProcessor.inc (working copy) @@ -97,25 +97,6 @@ $target_item = array(); } - // Many mappers add to existing fields rather than replacing them. Hence we - // need to clear target elements of each item before mapping in case we are - // mapping on a prepopulated item such as an existing node. - $convert_to_array = FALSE; - if (is_array($target_item)) { - $target_item = (object)$target_item; - $convert_to_array = TRUE; - } - foreach ($this->config['mappings'] as $mapping) { - if (isset($targets[$mapping['target']]['real_target'])) { - unset($target_item->{$targets[$mapping['target']]['real_target']}); - } - elseif (isset($target_item->{$mapping['target']})) { - unset($target_item->{$mapping['target']}); - } - } - if ($convert_to_array) { - $target_item = (array)$target_item; - } /* This is where the actual mapping happens: For every mapping we envoke @@ -139,16 +120,39 @@ $value = $parser->getSourceElement($batch, $mapping['source']); } - // Map the source element's value to the target. - if (is_array($targets[$this->id][$mapping['target']]) && - isset($targets[$this->id][$mapping['target']]['callback']) && - function_exists($targets[$this->id][$mapping['target']]['callback'])) { - $callback = $targets[$this->id][$mapping['target']]['callback']; - $callback($target_item, $mapping['target'], $value); + if (isset($value)) { // only if a column was present in the feed + + // Many mappers add to existing fields rather than replacing them. Hence we + // need to clear target elements of each item before mapping in case we are + // mapping on a prepopulated item such as an existing node. + $convert_to_array = FALSE; + if (is_array($target_item)) { + $target_item = (object)$target_item; + $convert_to_array = TRUE; + } + + if (isset($targets[$mapping['target']]['real_target'])) { + unset($target_item->{$targets[$mapping['target']]['real_target']}); + } + elseif (isset($target_item->{$mapping['target']})) { + unset($target_item->{$mapping['target']}); + } + + if ($convert_to_array) { + $target_item = (array)$target_item; + } + + // Map the source element's value to the target. + if (is_array($targets[$this->id][$mapping['target']]) && + isset($targets[$this->id][$mapping['target']]['callback']) && + function_exists($targets[$this->id][$mapping['target']]['callback'])) { + $callback = $targets[$this->id][$mapping['target']]['callback']; + $callback($target_item, $mapping['target'], $value); + } + else { + $this->setTargetElement($target_item, $mapping['target'], $value); + } } - else { - $this->setTargetElement($target_item, $mapping['target'], $value); - } } return $target_item; }