Webform - Kirim nilai dari Drupal 7 dari ke url eksternal

11

Saya seorang pemula yang memproklamirkan diri untuk membuat formulir di Drupal. Saya memiliki formulir yang dihosting di situs web Drupal 7 (menggunakan modul webform) dan perlu mengirimkan nilai formulir ke url eksternal. Saya telah meneliti ini untuk sementara waktu sekarang dan menulis modul khusus yang menggunakan modul webform untuk mengirimkan secara eksternal menggunakan hook_form_alter dan menyerahkan kustom fungsi / handler (kode disisipkan di bawah).

Saya telah menggunakan halaman-halaman berikut sebagai panduan, tetapi saya belum bisa mendapatkan formulir untuk berfungsi: https://drupal.org/node/1357136 Menggunakan drupal_http_post () untuk mengirim ke situs eksternal: Apa yang saya lakukan salah?

Bisakah seseorang memberi tahu saya jika saya berada di jalur yang benar? Bimbingan apa pun akan sangat membantu!

<?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'], '', '&'));
}
?>
Untuk kemenangan
sumber

Jawaban:

15

Dalam bentuk Drupal, kait form_alter dapat digunakan untuk mengubah hampir semua hal dalam formulir. Penangan pengiriman tambahan dapat ditangani, validasi dapat dilakukan, elemen dapat ditambahkan, dll.

Tetapi agar semua ini bisa berjalan, Drupal harus menjadi pihak yang bertanggung jawab dalam fase pembentukan dan penyerahan formulir.

Ketika Anda mengatur $form['#action'] = url('https://[url path to external site]');, Anda benar-benar menghapus Drupal dari tanggung jawab terakhir itu.

Periksa formulir yang diubah - Anda akan melihat bahwa tag formulir actiondiatur ke situs eksternal. Ketika formulir dikirimkan, browser mengirim semua datanya ke situs eksternal itu, dan Drupal tidak lagi dapat memvalidasi atau melakukan fungsi kirim dalam formulir . Saya pikir ini adalah kesalahpahaman yang terjadi.

Jika Anda tidak ingin Drupal memvalidasi formulir, catat pengiriman formulir web atau lakukan apa pun setelah pengiriman formulir dan biarkan situs jauh melakukan segalanya untuk pengiriman itu, kode Anda akan berfungsi dengan baik. Anda dapat menghapus $form['#submit'][] = 'webform_extra_submit';bagian dan webform_extra_submitfungsinya sendiri.

Namun, jika Anda ingin merekam kiriman dan mengirimkan data ke situs jarak jauh itu, Anda dapat melakukannya seperti ini:

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);

}
AyeshK
sumber
Terima kasih telah meluangkan waktu untuk menjelaskan !! Sangat membantu dan saya sangat menghargainya.
ForTheWin
+1, tetapi bagaimana jika saya memiliki perhitungan di Drupal dan memposting lagi ke jarak jauh?
niksmac
Setelah baris terakhir dijalankan, apakah pengguna akan dikirim ke situs yang disebutkan dalam $ url?
neelmeg
3

Saya telah berusaha mencari cara untuk mengatasi masalah ini dan akhirnya saya menemukan modul Webform Remote Post

Webform Remote Post adalah modul yang berfungsi di sepanjang modul Webform . Ini memudahkan integrasi antara Webforms dan aplikasi web lainnya (termasuk sistem seperti Salesforce dan Eloqua).

Semoga ini menghemat waktu berjam-jam bagi seseorang!

Membuat
sumber