protected function FeedsProcessor::map in Feeds 7
Same name and namespace in other branches
- 6 plugins/FeedsProcessor.inc \FeedsProcessor::map()
- 7.2 plugins/FeedsProcessor.inc \FeedsProcessor::map()
Execute mapping on an item.
This method encapsulates the central mapping functionality. When an item is processed, it is passed through map() where the properties of $source_item are mapped onto $target_item following the processor's mapping configuration.
For each mapping FeedsParser::getSourceElement() is executed to retrieve the source element, then FeedsProcessor::setTargetElement() is invoked to populate the target item properly. Alternatively a hook_x_targets_alter() may have specified a callback for a mapping target in which case the callback is asked to populate the target item instead of FeedsProcessor::setTargetElement().
See also
hook_feeds_parser_sources_alter()
hook_feeds_data_processor_targets_alter()
hook_feeds_node_processor_targets_alter()
hook_feeds_term_processor_targets_alter()
hook_feeds_user_processor_targets_alter()
Related topics
4 calls to FeedsProcessor::map()
- FeedsFeedNodeProcessor::map in plugins/
FeedsFeedNodeProcessor.inc - Execute mapping on an item.
- FeedsNodeProcessor::process in plugins/
FeedsNodeProcessor.inc - Implements FeedsProcessor::process().
- FeedsTermProcessor::map in plugins/
FeedsTermProcessor.inc - Execute mapping on an item.
- FeedsUserProcessor::map in plugins/
FeedsUserProcessor.inc - Execute mapping on an item.
3 methods override FeedsProcessor::map()
- FeedsFeedNodeProcessor::map in plugins/
FeedsFeedNodeProcessor.inc - Execute mapping on an item.
- FeedsTermProcessor::map in plugins/
FeedsTermProcessor.inc - Execute mapping on an item.
- FeedsUserProcessor::map in plugins/
FeedsUserProcessor.inc - Execute mapping on an item.
File
- plugins/
FeedsProcessor.inc, line 84
Class
- FeedsProcessor
- Abstract class, defines interface for processors.
Code
protected function map(FeedsImportBatch $batch, $target_item = NULL) {
// Static cache $targets as getMappingTargets() may be an expensive method.
static $sources;
if (!isset($sources[$this->id])) {
$sources[$this->id] = feeds_importer($this->id)->parser
->getMappingSources();
}
static $targets;
if (!isset($targets[$this->id])) {
$targets[$this->id] = $this
->getMappingTargets();
}
$parser = feeds_importer($this->id)->parser;
if (empty($target_item)) {
$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.
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']});
}
}
/*
This is where the actual mapping happens: For every mapping we envoke
the parser's getSourceElement() method to retrieve the value of the source
element and pass it to the processor's setTargetElement() to stick it
on the right place of the target item.
If the mapping specifies a callback method, use the callback instead of
setTargetElement().
*/
self::loadMappers();
foreach ($this->config['mappings'] as $mapping) {
// Retrieve source element's value from parser.
if (is_array($sources[$this->id][$mapping['source']]) && isset($sources[$this->id][$mapping['source']]['callback']) && function_exists($sources[$this->id][$mapping['source']]['callback'])) {
$callback = $sources[$this->id][$mapping['source']]['callback'];
$value = $callback($batch, $mapping['source']);
}
else {
$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);
}
else {
$this
->setTargetElement($target_item, $mapping['target'], $value);
}
}
return $target_item;
}