Hi I'm trying to figure out how to handle multiple values, al least for cck basic contents.

This is the code i came up with:
the idea is that the user maps the different feed items or csv columns to the same field mapper.
IF the cck field is set to multiple i add values to the array, if not i just write the first element.

// $Id: feedapi_mapper_content.inc,v 1.1.2.4.2.2 2008/10/27 00:07:34 alexb Exp $

/**
 * On behalf implementation of hook_feedapi_mapper for content.module (CCK).
 *
 * @param string $op
 * @param Drupal node $node
 * @param string $field_name
 * @param string, number or array of string or number $feed_element
 * @param string or number as id $sub_field
 *
 */
function content_feedapi_mapper($op, $node, $field_name, $feed_element = array(), $sub_field = '') {
  // Test for the node field that we would like to map to.
  if (strpos($field_name, 'field_') === 0) {
    if ($op == 'describe') {
      // Describe what we are doing in this mapper. This shows up as help text on the mapping page.
      if (feedapi_mapper_content_is_cck_type($field_name, array('text', 'number_integer', 'number_decimal'))) {
        return t('Maps a string or a number to this CCK field.');
      }
    }
    else if ($op == 'list') {
      // Here we are being asked to list sub fields we would like to map to.
      if (feedapi_mapper_content_is_cck_type($field_name, array('text', 'number_integer', 'number_decimal'))) {
        return TRUE;
      }
      return FALSE;
    }
    else if ($op == 'map') {
      // Here is where the actual mapping happens.
      // When we are called at this point, $field_name contains the name of the field the user has
      // decided to map to and $field_element is the feed item element the user has decided to map.
      // We just need to put the two things together. The data structure here depends a lot on
      // CCK. We stick the value in $feed_element into $node->$field_name[0]['value'].
     


      $field_settings = content_fields($field_name); // We need to check fields settings to know if field is multiple
      
     
      if ($field_settings['multiple']==0) {
      	 // single field
	      if (!is_array($feed_element)) {
	        $field = isset($node->$field_name) ? $node->$field_name : array();
	        $field[0]['value'] = $feed_element;
	        $node->$field_name = $field;
	      }
      } elseif ($field_settings['multiple']==1) {
			// unlimited values field
	      if (!is_array($feed_element)) {
	        $field = isset($node->$field_name) ? $node->$field_name : array();
	        $field[]['value'] = $feed_element;
	        $node->$field_name = $field;
	      }


      } elseif (is_numeric($i = $field_settings['multiple'])) {
      	
      
      	if (!is_array($feed_element)) {
      		$l = count($node->$field_name);
      		if ($l < $i) {
	        $field = isset($node->$field_name) ? $node->$field_name : array();
	        $field[]['value'] = $feed_element;
	        $node->$field_name = $field;
	      	}
	      }
      
      }
      return $node;
    }
  }
}
 

First round of test was fine but i had only txt fields to test with.
cheers

Comments

Anonymous’s picture

Did you actually replaced the content_feedapi_mapper() function from feedapi_mapper_content.inc?

gionnibgud’s picture

Sure I did! But this code is just a proposal and it would be a good thing if someone else would look into it.
I guess I could make a patch but I'd rather wait for some feedback.
If you want to test it you can copy and paste (remove the final '?>'). But first backup your DB, do your vodoo, move around pencils on your desk or whatever you do when you don't want to screw up your drupal installation... ;) (most likely if there are errors it will just fail import and that's all!!)

summit’s picture

Subscribing, any progress in this field please?
greetings, Martijn