Webform - Gửi giá trị từ Drupal 7 từ url bên ngoài


11

Tôi là một người mới tự xưng là người tạo ra các hình thức trong Drupal. Tôi có một biểu mẫu được lưu trữ trên trang web Drupal 7 (sử dụng mô-đun biểu mẫu web) và cần gửi các giá trị biểu mẫu cho một url bên ngoài. Bây giờ tôi đã nghiên cứu vấn đề này và đã viết một mô-đun tùy chỉnh sử dụng mô-đun biểu mẫu web để gửi bên ngoài bằng hook_form_alter và trình xử lý / chức năng gửi tùy chỉnh (mã được dán bên dưới).

Tôi đã sử dụng các trang sau làm hướng dẫn, nhưng tôi chưa thể làm cho biểu mẫu hoạt động: https://drupal.org/node/1357136 Sử dụng drupal_http_post () để gửi đến trang bên ngoài: Tôi đang làm gì Sai lầm?

Ai đó có thể cho tôi biết nếu tôi đang đi đúng hướng? Bất kỳ hướng dẫn sẽ hữu ích!

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

Câu trả lời:


15

Trong các hình thức Drupal, hook form_alter có thể được sử dụng để thay đổi hầu hết mọi thứ trong biểu mẫu. Trình xử lý trình bổ sung có thể được xử lý, xác thực có thể được thực hiện, các yếu tố có thể được thêm vào, v.v.

Nhưng để tất cả những thứ này hoạt động, Drupal cần phải là bên chịu trách nhiệm trong cả giai đoạn xây dựng hình thức và giai đoạn gửi biểu mẫu.

Khi bạn đặt $form['#action'] = url('https://[url path to external site]');, bạn thực sự loại bỏ Drupal khỏi trách nhiệm sau này.

Kiểm tra biểu mẫu đã thay đổi - bạn sẽ thấy thẻ biểu mẫu actionđược đặt thành trang bên ngoài. Khi biểu mẫu được gửi, trình duyệt sẽ gửi tất cả dữ liệu của nó đến trang web bên ngoài đó và Drupal không còn có thể xác thực hoặc thực hiện các chức năng gửi trong biểu mẫu . Tôi nghĩ rằng đây là quan niệm sai lầm xảy ra.

Nếu bạn không muốn Drupal xác thực biểu mẫu, hãy ghi lại việc gửi biểu mẫu web hoặc làm bất cứ điều gì sau khi gửi biểu mẫu và để trang web từ xa làm mọi thứ cho việc gửi đó, mã của bạn sẽ hoạt động tốt. Bạn có thể loại bỏ $form['#submit'][] = 'webform_extra_submit';một phần và webform_extra_submitchức năng của chính nó.

Tuy nhiên, nếu bạn muốn ghi lại việc gửi và gửi dữ liệu đến trang web từ xa đó, bạn có thể làm như thế này:

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

}

CẢM ƠN BẠN đã dành thời gian để làm rõ !! Vô cùng hữu ích và tôi thực sự đánh giá cao nó.
Dành cho

+1, nhưng nếu tôi có tính toán trong Drupal và đăng lại từ xa thì sao?
niksmac

Sau khi dòng cuối cùng thực thi, người dùng sẽ được gửi đến trang web được đề cập trong $ url chứ?
neelmeg

3

Tôi đã cố gắng tìm cách giải quyết vấn đề này và cuối cùng tôi đã tìm thấy mô-đun Webform Remote Post

Webform Remote Post là một mô-đun hoạt động dọc theo mô-đun Webform . Nó giảm bớt sự tích hợp giữa Webforms và các ứng dụng web khác (bao gồm các hệ thống như Salesforce và Eloqua).

Hy vọng nó sẽ tiết kiệm cho ai đó hàng giờ tìm kiếm!

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.