Webform - Отправить значения из Drupal 7 из на внешний URL


11

Я самопровозглашенный новичок в создании форм в Drupal. У меня есть форма, размещенная на веб-сайте Drupal 7 (с использованием модуля веб-формы), и мне нужно отправить значения формы на внешний URL-адрес. Я изучал это некоторое время и написал собственный модуль, который использует модуль webform для внешней отправки с использованием 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 могут использоваться для изменения почти всего в форме. Можно обработать дополнительные обработчики отправки, выполнить проверку, добавить элементы и т. Д.

Но чтобы все это работало, 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.