2013-07-26 46 views
2

我使用自定義模塊攔截表單提交,然後cURL將數據提交給第三方網站(在這種情況下,Pardot ...但我在其他方面得到了相同的結果像Marketo一樣的CRM)。使用cURL的Drupal鉤子webform提交兩次

這一切正常,數據已正確提交,但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); 
} 

回答

1

所以經過更多的調試後,事實證明Drupal form_alter函數(這是調用上面的提交函數)被調用兩次,從而導致Pardot得到兩個提交。

發生這種情況的原因是因爲主題名稱和此自定義模塊名稱相同。一旦我卸載模塊,將模塊文件夾,.info和.module名稱更改爲與主題名稱不同,它只調用一次form_alter函數。

+0

非常感謝...你剛剛救了我的一天! –

0

你在網站上有多個網絡表單嗎?也許2?

因爲此刻函數hook_form_alter與使用'strstr'的if語句一起運行。您應該在if語句中更具體,並使用等於運算符(「==」)的網絡表單的表單ID。

+0

我在網站上有兩個webforms,但出現在不同的頁面上。我希望兩個表單都使用cURL提交,這就是爲什麼我使用通用if語句的原因。我會嘗試將它指定爲一個,看看是否能解決問題,然後找出將它應用於兩者的方法。 –

+0

不幸的是,它仍然提交兩次。 –