Index: salesforce_api/salesforce_api.module =================================================================== RCS file: /cvs/salesforce/salesforce_api/salesforce_api.module,v retrieving revision 1.1 diff -u -r1.1 salesforce_api.module --- salesforce_api/salesforce_api.module 30 Jun 2009 07:52:05 -0000 1.1 +++ salesforce_api/salesforce_api.module 30 Jun 2009 08:20:30 -0000 @@ -202,6 +202,7 @@ foreach ($object->fields as $field) { $objects[$sf_objects[$key]]['fields'][$field->name] = array( 'label' => t($field->label), + 'type' => $field->type, ); if ($field->createable != 1) { $objects[$sf_objects[$key]]['fields'][$field->name]['type'] = SALESFORCE_FIELD_SOURCE_ONLY; @@ -489,18 +490,18 @@ } /** - * Creates an object for export to Salesforce based on the supplied source + * Creates an object for export to Salesforce based on the supplied Drupal * object and fieldmap. * * @param $fieldmap - * The index of the fieldmap used to filter the source object into the export. - * @param $source - * The source object used to generate the export. + * The index of the fieldmap used to filter the Drupal object into the export. + * @param $drupal_data + * The Drupal object used to generate the export. * @return - * An object of the source type ready for export to Salesforce or FALSE if + * An object containing data ready for export to Salesforce or FALSE if * the operation failed. */ -function salesforce_api_fieldmap_export_create($fieldmap, $source = NULL) { +function salesforce_api_fieldmap_export_create($fieldmap, $drupal_data = NULL) { // Load the fieldmap from the database. $map = salesforce_api_fieldmap_load($fieldmap); @@ -509,28 +510,25 @@ return FALSE; } - // Load the source object definition so we know how to get values for its - // various fields. - if ($map['action'] == 'import') { - $source_object = salesforce_api_fieldmap_objects_load('salesforce', $map['salesforce']); - } - else { - $source_object = salesforce_api_fieldmap_objects_load('drupal', $map['drupal']); - } + $drupal_object_definition = salesforce_api_fieldmap_objects_load('drupal', $map['drupal']); + $sf_object_definition = salesforce_api_fieldmap_objects_load('salesforce', $map['salesforce']); $object = new stdClass(); // Loop through the fields on the fieldmap. - foreach ($map['fields'] as $key => $value) { - // If a handler is specified for retrieving a value for the source field... - if (isset($source_object['fields'][$value]['export'])) { + foreach ($map['fields'] as $sf_fieldname => $drupal_fieldname) { + // If a handler is specified for retrieving a value for the Drupal field... + if (isset($drupal_object_definition['fields'][$drupal_fieldname]['export'])) { + $drupal_field_export_handler = $drupal_object_definition['fields'][$drupal_fieldname]['export']; + $drupal_field_definition = $drupal_object_definition['fields'][$drupal_fieldname]; + $sf_field_definition = $sf_object_definition['fields'][$sf_fieldname]; // Get the value for the field from the handler function. - $object->$key = $source_object['fields'][$value]['export']($source, $value); + $object->$sf_fieldname = $drupal_field_export_handler($drupal_data, $drupal_fieldname, $drupal_field_definition, $sf_field_definition); } - elseif (isset($source->$value)) { - // Otherwise set the field on the export object to the value of the source - // field if it's present on the source object. - $object->$key = $source->$value; + // Otherwise set the field on the export object to the value of the Drupal + // field if it's present on the source object. + elseif (isset($drupal_data->$drupal_fieldname)) { + $object->$sf_fieldname = $drupal_data->$drupal_fieldname; } } Index: sf_node/sf_node.module =================================================================== RCS file: /cvs/salesforce/sf_node/sf_node.module,v retrieving revision 1.1 diff -u -r1.1 sf_node.module --- sf_node/sf_node.module 30 Jun 2009 07:51:13 -0000 1.1 +++ sf_node/sf_node.module 30 Jun 2009 08:27:59 -0000 @@ -140,6 +140,8 @@ 'group' => t('CCK fields'), 'export' => $export_handler, 'import' => $import_handler, + 'type' => $field['type'], + 'multiple' => $field['multiple'], ); // If the field was a date field, add the "To" date if enabled. @@ -160,21 +162,54 @@ } // Returns the basic value of a CCK field from $array[0]['value']. -function _sf_node_export_cck_default($source, $field) { +function _sf_node_export_cck_default($node, $fieldname, $drupal_field_definition, $sf_field_definition) { // Get the data array for the field. - $data = $source->$field; - - // Return the first value; currently doesn't support multiple value fields. - return $data[0]['value']; + $data = $node->$fieldname; + + // Convert data based on what SF type we're sending it to. + switch ($sf_field_definition['type']) { + case 'multipicklist': + // SF wants a semicolon-delimited string. + $values = array(); + foreach ($data as $row) { + $values[] = $row['value']; + } + $result = implode(';', $values); + break; + default: + // Unless handled above in this switch, we don't yet handle fields with multiple values. + $result = $data[0]['value']; + break; + } + + return $result; } -// Returns the basic value of a CCK field from $array[0]['value']. -function _sf_node_import_cck_default(&$node, $key, $source, $field) { - $data = $node->$key; - - $data[0]['value'] = $source->$field; - - $node->$key = $data; +// Populates the value of a CCK field from its corresponding SF field's value. +function _sf_node_import_cck_default(&$node, $drupal_fieldname, $drupal_field_definition, $sf_data, $sf_fieldname, $sf_field_definition) { + $data = array(); + + // Convert data based on what SF type we're importing. + switch ($sf_field_definition['type']) { + case 'multipicklist': + // SF sends multiple values as a semicolon-delimited string. + if ($drupal_field_definition['multiple']) { + $sf_data = explode(';', $sf_data->$sf_fieldname); + foreach ($sf_data as $row) { + $data[] = array('value' => $row); + } + } + else { + $data[0]['value'] = $sf_data->$sf_fieldname; + } + break; + default: + // Unless handled above in this switch, we don't yet handle fields with multiple values. + $data[0]['value'] = $sf_data->$sf_fieldname; + break; + } + + $node->$drupal_fieldname = $data; } // Returns the todate for a CCK date field. @@ -283,7 +318,9 @@ foreach ($map['fields'] as $key => $value) { if (isset($drupal_object['fields'][$value]['export'])) { - $drupal_value = $drupal_object['fields'][$value]['export']($node, $value); + $drupal_field_definition = $drupal_object['fields'][$value]; + $sf_field_definition = $object['fields'][$key]; + $drupal_value = $drupal_object['fields'][$value]['export']($node, $value, $drupal_field_definition, $sf_field_definition); } elseif (isset($node->$value)) { $drupal_value = $node->$value; @@ -490,10 +527,10 @@ function sf_node_import($sfid, $fieldmap, $nid = NULL) { // Retrieve the object from Salesforce. $sf = salesforce_api_connect(); - $data = $sf->retrieve(array($sfid), $fieldmap); + $sf_data = $sf->retrieve(array($sfid), $fieldmap); // Return FALSE if the object data was not found at Salesforce. - if (empty($data)) { + if (empty($sf_data)) { return FALSE; } @@ -501,8 +538,8 @@ $map = salesforce_api_fieldmap_load($fieldmap); // Load the object definitions. - $drupal_object = salesforce_api_fieldmap_objects_load('drupal', $map['drupal']); - $salesforce_object = salesforce_api_fieldmap_objects_load('salesforce', $map['salesforce']); + $drupal_object_definition = salesforce_api_fieldmap_objects_load('drupal', $map['drupal']); + $salesforce_object_definition = salesforce_api_fieldmap_objects_load('salesforce', $map['salesforce']); // If a node was specified, attempt to load it. $node = node_load($nid); @@ -510,16 +547,19 @@ // If the node exists, simply update the existing node. if ($node->nid) { // Loop through the fields on the fieldmap. - foreach ($map['fields'] as $value => $key) { - // If a handler is specified for importing a value from Salesforce. - if (isset($drupal_object['fields'][$key]['import'])) { - // Get the value for the field from the handler function. - $drupal_object['fields'][$key]['import']($node, $key, $data, $value); + foreach ($map['fields'] as $sf_fieldname => $drupal_fieldname) { + // If a handler is specified for importing a value from Salesforce.... + if (isset($drupal_object_definition['fields'][$drupal_fieldname]['import'])) { + $drupal_field_import_handler = $drupal_object_definition['fields'][$drupal_fieldname]['import']; + $drupal_field_definition = $drupal_object_definition['fields'][$drupal_fieldname]; + $sf_field_definition = $salesforce_object_definition['fields'][$sf_fieldname]; + // Let the handler function set the value for the field on the node. + $drupal_field_import_handler($node, $drupal_fieldname, $drupal_field_definition, $sf_data, $sf_fieldname, $sf_field_definition); } - elseif (isset($data->$value)) { + elseif (isset($sf_data->$sf_fieldname)) { // Otherwise set the field on the export object to the value of the source // field if it's present on the source object. - $node->$key = $data->$value; + $node->$drupal_fieldname = $sf_data->$sf_fieldname; } } Index: sf_user/sf_user.module =================================================================== RCS file: /cvs/salesforce/sf_user/sf_user.module,v retrieving revision 1.1 diff -u -r1.1 sf_user.module --- sf_user/sf_user.module 30 Jun 2009 07:51:57 -0000 1.1 +++ sf_user/sf_user.module 30 Jun 2009 08:30:53 -0000 @@ -162,33 +162,36 @@ // Retrieve the object from Salesforce. $sf = salesforce_api_connect(); - $data = $sf->retrieve(array($account->salesforce['sfid']), $account->salesforce['fieldmap']); + $sf_data = $sf->retrieve(array($account->salesforce['sfid']), $account->salesforce['fieldmap']); // Load the fieldmap data. $map = salesforce_api_fieldmap_load($account->salesforce['fieldmap']); // Load the object definitions. - $drupal_object = salesforce_api_fieldmap_objects_load('drupal', $map['drupal']); - $object = salesforce_api_fieldmap_objects_load('salesforce', $map['salesforce']); + $drupal_object_definition = salesforce_api_fieldmap_objects_load('drupal', $map['drupal']); + $sf_field_definition = salesforce_api_fieldmap_objects_load('salesforce', $map['salesforce']); $header = array(t('Field name'), t('Drupal user value'), t('Salesforce @type value', array('@type' => salesforce_api_fieldmap_object_label('salesforce', $map['salesforce'])))); $rows = array(); - foreach ($map['fields'] as $key => $value) { - if (isset($drupal_object['fields'][$value]['export'])) { - $drupal_value = $drupal_object['fields'][$value]['export']($account, $value); + foreach ($map['fields'] as $sf_fieldname => $drupal_fieldname) { + if (isset($drupal_object_definition['fields'][$drupal_fieldname]['export'])) { + $drupal_field_export_handler = $drupal_object_definition['fields'][$drupal_fieldname]['export']; + $drupal_field_definition = $drupal_object_definition['fields'][$drupal_fieldname]; + $sf_field_definition = $sf_object_definition['fields'][$sf_fieldname]; + $drupal_value = $drupal_field_export_handler($account, $drupal_fieldname, $drupal_field_definition, $sf_field_definition); } - elseif (isset($account->$value)) { - $drupal_value = $account->$value; + elseif (isset($account->$drupal_fieldname)) { + $drupal_value = $account->$drupal_fieldname; } else { $drupal_value = ''; } $rows[] = array( - $object['fields'][$key]['label'], + $sf_field_definition['fields'][$sf_fieldname]['label'], $drupal_value, - $data->$key, + $sf_data->$sf_fieldname, ); } @@ -216,10 +219,10 @@ $header = array(t('Field name'), t('Salesforce @type value', array('@type' => salesforce_api_fieldmap_object_label('salesforce', $map['salesforce'])))); $rows = array(); - foreach ((array) $data as $key => $value) { - if (!isset($map['fields'][$key]) && isset($object['fields'][$key])) { + foreach ((array) $sf_data as $key => $value) { + if (!isset($map['fields'][$key]) && isset($sf_field_definition['fields'][$key])) { $rows[] = array( - $object['fields'][$key]['label'], + $sf_field_definition['fields'][$key]['label'], $value, ); } @@ -241,7 +244,7 @@ foreach (salesforce_api_fieldmap_system_fields() as $key => $value) { $rows[] = array( $value['label'], - $data->$key, + $sf_data->$key, ); } @@ -263,7 +266,7 @@ '#collapsed' => TRUE, ); $form['raw']['data'] = array( - '#value' => '
'. print_r($data, TRUE) .'', + '#value' => '
'. print_r($sf_data, TRUE) .'', ); } @@ -374,10 +377,10 @@ function sf_user_import($sfid, $fieldmap, $uid = NULL) { // Retrieve the object from Salesforce. $sf = salesforce_api_connect(); - $data = $sf->retrieve(array($sfid), $fieldmap); + $sf_data = $sf->retrieve(array($sfid), $fieldmap); // Return FALSE if the object data was not found at Salesforce. - if (empty($data)) { + if (empty($sf_data)) { return FALSE; } @@ -385,8 +388,8 @@ $map = salesforce_api_fieldmap_load($fieldmap); // Load the object definitions. - $drupal_object = salesforce_api_fieldmap_objects_load('drupal', $map['drupal']); - $salesforce_object = salesforce_api_fieldmap_objects_load('salesforce', $map['salesforce']); + $drupal_object_definition = salesforce_api_fieldmap_objects_load('drupal', $map['drupal']); + $salesforce_object_definition = salesforce_api_fieldmap_objects_load('salesforce', $map['salesforce']); // If a node was specified, attempt to load it. $account = user_load(array('uid' => $uid)); @@ -394,19 +397,22 @@ // If the node exists, simply update the existing node. if ($account->uid) { // Loop through the fields on the fieldmap. - foreach ($map['fields'] as $value => $key) { + foreach ($map['fields'] as $sf_fieldname => $drupal_fieldname) { // If a handler is specified for importing a value from Salesforce. - if (isset($drupal_object['fields'][$key]['import'])) { + if (isset($drupal_object_definition['fields'][$drupal_fieldname]['import'])) { + $drupal_field_import_handler = $drupal_object_definition['fields'][$drupal_fieldname]['import']; + $drupal_field_definition = $drupal_object_definition['fields'][$drupal_fieldname]; + $sf_field_definition = $salesforce_object_definition['fields'][$sf_fieldname]; // Get the value for the field from the handler function. - $change = $drupal_object['fields'][$key]['import']($account, $key, $data, $value); + $change = $drupal_field_import_handler($account, $drupal_fieldname, $drupal_field_definition, $sf_data, $sf_fieldname, $sf_field_definition); $changes = array_merge($changes, $change); } - elseif (isset($data->$value)) { - // Otherwise set the field on the export object to the value of the source - // field if it's present on the source object. - if ($account->$key != $data->$value) { - $changes[$key] = $data->$value; + // Otherwise set the field on the export object to the value of the source + // field if it's present on the source object. + elseif (isset($sf_data->$sf_fieldname)) { + if ($account->$drupal_fieldname != $sf_data->$sf_fieldname) { + $changes[$drupal_fieldname] = $sf_data->$sf_fieldname; } } }