Вебформа - надсилайте значення з Drupal 7 на зовнішній URL


11

Я самовизнаний новачок для створення форм у Drupal. У мене розміщена форма на веб-сайті Drupal 7 (за допомогою модуля веб-форми), і мені потрібно подати значення форми на зовнішній URL. Я займаюся цим дослідженням деякий час і написав користувальницький модуль, який використовує модуль веб-форми для подання зовнішньої програми за допомогою гака_форма_альтера та спеціального обробника / функції подання (код, вставлений нижче).

Я використовую наступні сторінки в якості посібників, але мені не вдалося змусити форму працювати: 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

У друпальських формах гачки form_alter можуть використовуватися для зміни практично будь-якої форми. Можна обробляти додаткові обробники подачі, проводити перевірку, додавати елементи тощо.

Але для того, щоб усі вони працювали, 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 . Це полегшує інтеграцію між веб-формами та іншими веб-додатками (включаючи такі системи, як Salesforce та Eloqua).

Сподіваюсь, це заощадить когось години перегляду!

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.