You are here

function sf_node_nodeapi in Salesforce Suite 6.2

Same name and namespace in other branches
  1. 5.2 sf_node/sf_node.module \sf_node_nodeapi()

Implementation of hook_nodeapi().

File

sf_node/sf_node.module, line 53
Integrates the core node object and various node related modules with the Salesforce API.

Code

function sf_node_nodeapi(&$node, $op, $a3 = NULL, $a4 = NULL) {
  switch ($op) {
    case 'load':
      $node->salesforce = salesforce_api_id_load('node', $node->nid);
      break;
    case 'delete':
      $maps = salesforce_api_salesforce_field_map_load_by(array(
        'drupal' => 'node_' . $node->type,
      ));
      $map = current($maps);
      if ($map->automatic & SALESFORCE_AUTO_SYNC_DELETE) {
        $continue = TRUE;
        $continues = module_invoke_all('salesforce_api_delete', $node->salesforce->sfid, $map, $node->nid);
        if (!empty($continues)) {
          foreach ($continues as $continue) {
            if ($continue === FALSE) {
              break;
            }
          }
        }
        if ($continue) {
          salesforce_api_delete_salesforce_objects($node->salesforce->sfid);
        }
      }
      salesforce_api_delete_object_map('node', $node->nid);
      break;
    case 'update':
    case 'insert':

      // When importing *from* Salesforce, don't export *back* to Salesforce.
      if (isset($node->sf_node_skip_export)) {
        break;
      }

      // If this is an update, and the node already has a salesforce mapping,
      // try to load it. If the load fails, we need to fetch the appropriate
      // fieldmap. Either way, we're upserting the salesforce record.
      $salesforce = (object) array(
        'name' => NULL,
        'sfid' => NULL,
      );
      if ($node->nid) {
        $salesforce = salesforce_api_id_load('node', $node->nid);
      }

      // If we have an existing link, attempt to load the assoc'd map.
      if (!empty($salesforce->name)) {
        $map = salesforce_api_fieldmap_load($salesforce->name);
      }

      // If the sf link wasn't found, or if it was found but assoc'd to a
      // non-existent map, grab any maps assoc'd with this node type.
      if (empty($salesforce->name) || empty($map)) {
        $maps = salesforce_api_salesforce_field_map_load_by(array(
          'drupal' => 'node_' . $node->type,
        ));
        if (empty($maps)) {
          break;
        }
      }
      else {
        $maps = array(
          $map->name => $map,
        );
      }
      foreach ($maps as $map) {
        $auto_create = $map->automatic & SALESFORCE_AUTO_SYNC_CREATE;
        $auto_update = $map->automatic & SALESFORCE_AUTO_SYNC_UPDATE;
        if (!$auto_create && $op == 'insert' || !$auto_update && $op == 'update') {
          unset($maps[$map->name]);
        }
      }

      // If all our maps were unset, abort this procedure.
      if (empty($maps)) {
        break;
      }

      // Otherwise, use the first fieldmap.
      $map = reset($maps);
      $salesforce->name = $map->name;

      // Check if there is more than one fieldmap in the result.
      if (user_access('administer salesforce') and next($maps)) {
        if (!empty($map->description)) {
          $description = '(' . $map->description . ')';
        }
        drupal_set_message(t('Warning: more than one "automatic" salesforce mapping detected. Used fieldmap !map_name @map_description.', array(
          '!map_name' => l($map->name, SALESFORCE_PATH_FIELDMAPS . '/' . $map->name . '/edit'),
          '@map_description' => $description,
        )), 'warning');
      }

      // Finally, export the node to Salesforce.
      try {
        sf_node_export($node, $salesforce->name, $salesforce->sfid);
      } catch (Exception $e) {
        salesforce_api_log(SALESFORCE_LOG_SOME, 'Exception while attempting to export node: ' . $e
          ->getMessage(), array(), WATCHDOG_ERROR, l('node ' . $node->nid, 'node/' . $node->nid));
      }
      break;
  }
}