Webform - ส่งค่าจาก Drupal 7 จากไปยัง URL ภายนอก


11

ฉันเป็นมือใหม่ที่ประกาศตัวเองถึงการสร้างแบบฟอร์มใน Drupal ฉันมีแบบฟอร์มที่โฮสต์บนเว็บไซต์ Drupal 7 (ใช้โมดูล webform) และจำเป็นต้องส่งค่าฟอร์มไปยัง URL ภายนอก ฉันได้ทำการค้นคว้ามาระยะหนึ่งแล้วและเขียนโมดูลที่กำหนดเองที่ใช้โมดูลเว็บฟอร์มเพื่อส่งภายนอกโดยใช้ 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 hooks เพื่อเปลี่ยนอะไรก็ได้ในแบบฟอร์ม สามารถจัดการตัวจัดการการส่งเพิ่มเติมได้สามารถตรวจสอบความถูกต้องสามารถเพิ่มองค์ประกอบได้ ฯลฯ

แต่สำหรับสิ่งเหล่านี้ในการทำงาน Drupal จำเป็นต้องเป็นฝ่ายที่รับผิดชอบทั้งในขั้นตอนการสร้างแบบฟอร์มและขั้นตอนการส่งแบบฟอร์ม

เมื่อคุณตั้งค่า$form['#action'] = url('https://[url path to external site]');คุณจะลบ Drupal ออกจากความรับผิดชอบหลังนั้น

ตรวจสอบรูปแบบที่เปลี่ยนแปลง - คุณจะเห็นว่าactionมีการตั้งค่าแท็กของฟอร์มไปยังไซต์ภายนอก เมื่อมีการส่งแบบฟอร์มเบราว์เซอร์จะส่งข้อมูลทั้งหมดไปยังไซต์ภายนอกนั้นและ Drupal จะไม่สามารถตรวจสอบความถูกต้องหรือทำหน้าที่ส่งข้อมูลในแบบฟอร์มอีกต่อไป ฉันคิดว่านี่เป็นความเข้าใจผิดที่เกิดขึ้น

หากคุณไม่ต้องการให้ Drupal ตรวจสอบความถูกต้องของฟอร์มให้บันทึกการส่งแบบฟอร์มทางเว็บหรือทำอะไรก็ได้หลังจากการส่งแบบฟอร์มและให้ไซต์ระยะไกลทำทุกอย่างสำหรับการส่งนั้นรหัสของคุณจะใช้ได้ดี คุณสามารถลบ$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 ช่วยลดการรวมระหว่าง Webforms และเว็บแอปพลิเคชันอื่น ๆ (รวมถึงระบบเช่น Salesforce และ Eloqua)

หวังว่ามันจะช่วยประหยัดเวลาในการค้นหา!

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.