private static function create($entry, $form, $feed) { self::log_debug(__METHOD__ . ': Starting the create process...'); $api = self::get_api(); $token = self::getToken(); // There was no token. This is all wrong. if (empty($token)) { self::log_error(__METHOD__ . ': There was no OAuth token. It was likely revoked. Aborting.'); return false; } if (!isset($feed['is_active']) || $feed['is_active'] == 0) { self::log_error(sprintf('%s: Feed `%s` is not active.', __METHOD__, $feed['meta']['contact_object_name'])); return false; } $merge_vars = self::process_merge_vars($entry, $form, $feed); $merge_vars = apply_filters('gf_salesforce_create_data', $merge_vars, $form, $entry, $feed, $api); // Make sure the charset is UTF-8 for Salesforce. $merge_vars = array_map(array('GFSalesforce', '_convert_to_utf_8'), $merge_vars); // Don't send merge_vars that are empty. It can cause problems with Salesforce strict typing. For example, // if the form has a text field where a number should go, but that number isn't always required, when it's // not supplied, we don't want to send <var></var> to Salesforce. It might choke because it expects a Double // data type, not an empty string $merge_vars = array_filter($merge_vars, array('GFSalesforce', '_remove_empty_fields')); // We create the object to insert/upsert into Salesforce $Account = new SObject(); // The fields to use are the merge vars $Account->fields = $merge_vars; // Set the type of object $Account->type = $feed['meta']['contact_object_name']; $foreign_key_label = self::primary_key_id($feed); try { if (!self::$instance instanceof GFSalesforce) { self::$instance = self::Instance(); } // If the primary field has been set, use that to upsert instead of create. // @since 2.5.2, to avoid duplicates at Salesforce if (!empty($feed['meta']['primary_field'])) { self::log_debug(sprintf('%s: Upserting using primary field of `%s`', __METHOD__, $feed['meta']['primary_field'])); if (empty(self::$instance->result->id)) { // old upsert // https://www.salesforce.com/us/developer/docs/api/Content/sforce_api_calls_upsert.htm self::log_debug(__METHOD__ . ': Upserting'); $result = $api->upsert($feed['meta']['primary_field'], array($Account)); } else { self::log_debug(sprintf('%s: Creating with previous id %s', __METHOD__, self::$instance->result->id)); $Account->fields[$feed['meta']['primary_field']] = self::$instance->result->id; $result = $api->create(array($Account)); } } else { self::log_debug(__METHOD__ . ': Creating, not upserting'); $result = $api->create(array($Account)); } $api_exception = ''; self::log_debug(sprintf('%s: $Account object: %s', __METHOD__, print_r($Account, true))); } catch (Exception $e) { self::log_error(sprintf("%s:\n\nException While Exporting Entry\nThere was an error exporting Entry #%s for Form #%s. Here's the error:\n%s", __METHOD__, $entry['id'], $form['id'], $e->getMessage())); $api_exception = "\r\n\t\t\t\tException Message: " . $e->getMessage() . "\nFaultstring: " . $e->faultstring . "\nFile: " . $e->getFile() . "\nLine: " . $e->getLine() . "\nArgs: " . serialize($merge_vars) . "\nTrace: " . serialize($e->getTrace()); gform_update_meta($entry['id'], 'salesforce_api_result', 'Error: ' . $e->getMessage()); } if (isset($result) && count($result) == 1 && !empty($result[0])) { self::$instance->result = $result = $result[0]; } if (isset($result->success) && !empty($result->success)) { $result_id = $result->id; self::$foreign_keys[$foreign_key_label] = $result_id; gform_update_meta($entry['id'], 'salesforce_id', $result_id); gform_update_meta($entry['id'], 'salesforce_api_result', 'success'); $success_note = sprintf(__('Successfully added/updated to Salesforce (%s) with ID #%s. View entry at %s', 'gravity-forms-salesforce'), $Account->type, $result_id, self::getTokenParam('instance_url') . '/' . $result_id); self::log_debug(__METHOD__ . ': ' . $success_note); self::add_note($entry["id"], $success_note); self::admin_screen_message(__('Entry added/updated in Salesforce.', 'gravity-forms-salesforce'), 'updated'); /** * @since 3.1.2 */ do_action('gravityforms_salesforce_object_added_updated', $Account, $feed, $result_id); return $result_id; } else { if (isset($result->errors[0])) { $errors = $result->errors[0]; } if (isset($errors)) { self::log_error(sprintf('%s: There was an error exporting Entry #%s for Form #%s. Salesforce responded with:', __METHOD__, $entry['id'], $form['id']) . "\n" . print_r($errors, true)); if ($email = self::is_notify_on_error()) { $error_heading = __('Error adding to Salesforce', 'gravity-forms-salesforce'); // Create the email message to send $message = sprintf(apply_filters('gravityforms_salesforce_notify_on_error_message', '<h3>' . $error_heading . '</h3>' . wpautop(__("There was an error when attempting to add %sEntry #%s from the form \"%s\"", 'gravity-forms-salesforce')), $errors, $entry, $form), '<a href="' . admin_url('admin.php?page=gf_entries&view=entry&id=' . $entry['form_id'] . '&lid=' . $entry['id']) . '">', $entry['id'] . '</a>', $form['title']); // Send as HTML $headers = "Content-type: text/html; charset=" . get_option('blog_charset') . "\r\n"; // Send email $sent = wp_mail($email, $error_heading, $message, $headers); if (!$sent) { self::log_error(__METHOD__ . ': There was an error sending the error email. This really isn\'t your day, is it?'); } } self::add_note($entry["id"], sprintf(__('Errors when adding to Salesforce (%s): %s', 'gravity-forms-salesforce'), $Account->type, $errors->message . $api_exception)); } self::admin_screen_message(__('Errors when adding to Salesforce. Entry not sent! Check the Entry Notes below for more details.', 'gravity-forms-salesforce'), 'error'); return false; } }