2

我正在使用自定义模块来拦截表单提交,然后 cURL 将数据提交到第 3 方网站(在这种情况下 Pardot ......但我在 Marketo 等其他 CRM 中也得到了相同的结果)。

这一切正常,数据已正确提交,但 Drupal 提交了两次。我在 Drupal 之外尝试了相同的 cURL 函数,它只发送一次,所以 Drupal 中发生了一些事情,导致这个函数运行了两次。

有人知道为什么会这样吗?谢谢!

更新:所以我做了一些更具体的测试,表单的数量或指定一个表单并不重要......它总是提交两次。

function hook_form_alter(&$form, &$form_state, $form_id) {
  if (strstr($form['#form_id'], 'webform_client_form_')) {
    array_unshift($form['#submit'], 'hook_pardot_submit');
  }
}
/**
 * Send post data to pardot via curl
 */
function hook_pardot_submit($form, &$form_state) {
  // Values sent from form 
  $values = $form_state['values']['submitted'];

  if ( ! function_exists('curl_init')) {
   error("Curl is not setup on this PHP server and is required for this script.");
  }

  //Open cURL connection
  $ch = curl_init();
  if (curl_error($ch) != "") {
    die("Error: $error");
  }

  // Submit data to pardot
  curl_setopt($ch, CURLOPT_URL, "http://mypardoturl.com");
  curl_setopt($ch, CURLOPT_POST, 1);
  curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($values,'', '&'));
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, FALSE);
  curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE);
  curl_setopt($ch, CURLOPT_HEADER, FALSE);
  curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
  curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);

  //Execute pardot PHP cURL
  $result = curl_exec($ch);

  //close cURL connection
  curl_close($ch);
}
4

2 回答 2

1

因此,经过更多调试后,事实证明 Drupal form_alter 函数(它调用了上面的提交函数)被调用了两次,从而导致 Pardot 获得了两次提交。

发生这种情况的原因是主题名称和此自定义模块名称相同。一旦我卸载了模块,将模块文件夹、.info 和 .module 名称更改为与主题名称不同,它只调用一次 form_alter 函数。

于 2013-08-05T01:44:36.717 回答
0

您的网站中是否有多个网络表单?也许2?

因为目前该函数hook_form_alter使用使用“strstr”的 if 语句运行。您应该在此处的 if 语句中更具体,并使用带有等号运算符("==")的 Web 表单的表单 ID 。

于 2013-07-27T12:51:33.443 回答