Веб-форма - Отправка значений из Drupal 7 с внешнего URL-адреса


Я самопровозглашенный новичок в создании форм в 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'], '', '&'));
}
?>
Author: Community, 2013-11-20

2 answers

В формах 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);

}
 16
Author: AyeshK, 2013-11-20 18:25:33

Я пытался найти способ решить эту проблему, и я, наконец, нашел Модуль удаленной записи веб-формы

Удаленная почта веб-формы - это модуль, который работает вместе с модулем веб-формы . Это облегчает интеграцию между веб-формами и другими веб-приложениями (включая такие системы, как Salesforce и Eloqua).

Надеюсь, это сэкономит кому-то часы поисков!

 3
Author: Makean, 2014-09-17 09:15:07