Веб-форма - Отправка значений из 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'], '', '&'));
}
?>
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);
}
Я пытался найти способ решить эту проблему, и я, наконец, нашел Модуль удаленной записи веб-формы
Удаленная почта веб-формы - это модуль, который работает вместе с модулем веб-формы . Это облегчает интеграцию между веб-формами и другими веб-приложениями (включая такие системы, как Salesforce и Eloqua).
Надеюсь, это сэкономит кому-то часы поисков!