web-dev-qa-db-ja.com

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

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

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

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

<?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'], '', '&'));
}
?>
11
ForTheWin

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

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

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

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

Drupalでフォームを検証したくない場合は、Webフォームの送信を記録するか、フォームの送信後にanythingを実行して、リモートサイトで実行everythingその送信では、コードは問題なく機能します。$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);

}
15
AyeshK

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

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

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

3
Makean