Webフォーム-Drupal 7から外部URLへの値の送信


11

私はDrupalでフォームを作成することを自称しています。Drupal 7のWebサイトでホストされているフォーム(webformモジュールを使用)があり、フォームの値を外部URLに送信する必要があります。私はしばらくこれを調査していて、webformモジュールを使用して、hook_form_alterとカスタム送信ハンドラー/関数(以下に貼り付けられたコード)を使用して外部送信するカスタムモジュールを作成しました。

次のページをガイドとして使用していますが、フォームを機能させることができません。https//drupal.org/node/1357136 drupal_http_post()を使用して外部サイトに送信する:違う?

私が正しい軌道に乗っているかどうか誰かが私に知らせることができますか?どんなガイダンスも役に立ちます!

<?php
function webform_extra_form_alter(&$form, &$form_state, $form_id)                 
{
   //only want form with nid 1171 to submit externally 
   //Note that "webform_client_form_1171" means modify the Webform form for the node with NID "1171". Adjust to match whichever webform node's form you're modifying
   if($form_id == 'webform_client_form_1171') 
       {
            $form['#action'] = url('https://[url path to external site]');
            $form['#attributes'] = array('enctype' => "application/x-www-form-urlencoded");
            $form['#submit'][] = 'webform_extra_submit';    
       }
}

// Adds a submit handler/function for the app signup form (Webform ID #1171) 

function webform_extra_submit($form, &$form_state) 
{
     // Changes can be made to the Webform node settings by modifying this variable
    //$form['#node']->webform;

    // Insert values into other database table using same input IDs as external db
    $option['query'] = array(
        $firstName => $form_state['values']['firstName'],
        $lastName => $form_state['values']['lastName'],
        $email => $form_state['values']['email'],
        $name => $form_state['values']['name'],
        $phone => $form_state['values']['phone'],
    );
    $url = url('https://[url path to external site]', $option); 
    $form_state['redirect'] = $url;
   //$form['#action'] = url('https:[url path to external site]');
   //$url = 'https://[url path to external site]';
   //$headers = array('Content-Type' => 'application/x-www-form-urlencoded',);
   //$response = drupal_http_request($url, $headers, 'POST', http_build_query($form_state['values'], '', '&'));
}
?>

回答:


15

Drupalフォームでは、form_alterフックを使用して、フォーム内のほとんどすべてのものを変更できます。追加の送信ハンドラの処理、検証の実行、要素の追加などが可能です。

しかし、これらすべてが機能するためには、Drupalがフォーム構築フェーズとフォーム送信フェーズの両方で責任者になる必要があります。

を設定すると$form['#action'] = url('https://[url path to external site]');、実際には後者の責任からDrupalが削除されます。

変更されたフォームを確認します。フォームタグactionが外部サイトに設定されていることがわかります。フォームが送信されると、ブラウザーはすべてのデータをその外部サイトに送信し、Drupalはフォームで送信機能を検証または実行できなくなります。これは誤解が起こっていると思います。

Drupalによるフォームの検証、Webフォーム送信の記録、またはフォーム送信後に何かを行い、リモートサイトでその送信のすべてを実行させたくない場合は、コードは問題なく機能します。$form['#submit'][] = 'webform_extra_submit';部品やwebform_extra_submit機能自体は外せます。

ただし、送信を記録し、そのリモートサイトにもデータを送信する場合は、次のように実行できます。

function webform_extra_form_alter(&$form, &$form_state, $form_id)                 
{
   //only want form with nid 1171 to submit externally 
   //Note that "webform_client_form_1171" means modify the Webform form for the node with NID "1171". Adjust to match whichever webform node's form you're modifying
   if($form_id == 'webform_client_form_1171') 
       {
            $form['#submit'][] = 'webform_extra_submit';    
       }
}

// Adds a submit handler/function for the app signup form (Webform ID #1171) 

function webform_extra_submit($form, &$form_state) {

    $options = array();
    // Array keys are matching the key that the remote site accepts. URL encoding will be taken care later.
    $options['data'] = array(
        'firstName' => $form_state['values']['firstName'],
        'lastName' => $form_state['values']['lastName'],
        'email' => $form_state['values']['email'],
        'name' => $form_state['values']['name'],
        'phone' => $form_state['values']['phone'],
    );
    $options['data'] = http_build_query($options['data']);
    $options['method'] => 'POST';
    $url = 'https://[url path to external site]'; 

    // Put your additional headers here. Cookie can be set as well. 
    $headers = array('Content-Type' => 'application/x-www-form-urlencoded');

    $options['headers'] => $headers;

    // Submits data to the remote server from the drupal server. User will remain in the Drupal form submission chain.
    $response = drupal_http_request($url, $options);

}

明確にするために時間を割いていただきありがとうございます!非常に役に立ち、本当に感謝しています。
ForTheWin

+1ですが、Drupalで計算してリモートに再度投稿するとどうなりますか?
niksmac

最後の行が実行された後、ユーザーは$ urlに記載されているサイトに送信されますか?
neelmeg

3

私はこの問題に取り組む方法を見つけようとしていましたが、ようやくWebform Remote Postモジュールを見つけました

Webform Remote Postは、Webformモジュールに沿って機能するモジュールです。Webフォームと他のWebアプリケーション(SalesforceやEloquaなどのシステムを含む)との統合が容易になります。

誰かが探す時間を節約できることを願っています!

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.