Formulário da Web - Envie valores do Drupal 7 de para um URL externo

11

Eu sou um novato auto-proclamado na criação de formulários no Drupal. Eu tenho um formulário hospedado em um site do Drupal 7 (usando o módulo webform) e preciso enviar os valores do formulário para um URL externo. Estou pesquisando isso há algum tempo e escrevi um módulo personalizado que usa o módulo webform para enviar externamente usando hook_form_alter e manipulador / função de envio personalizado (código colado abaixo).

Eu tenho usado as seguintes páginas como guias, mas não consegui fazer o formulário funcionar: https://drupal.org/node/1357136 Usando drupal_http_post () para enviar para o site externo: O que estou fazendo errado?

Alguém pode me informar se estou no caminho certo? Qualquer orientação seria útil!

<?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'], '', '&'));
}
?>
Para a vitória
fonte

Respostas:

15

Nos formulários Drupal, os ganchos form_alter podem ser usados ​​para alterar quase tudo no formulário. Manipuladores de envio adicionais podem ser manipulados, validação pode ser feita, elementos podem ser adicionados etc.

Mas, para que tudo funcione, o Drupal precisa ser a parte responsável na fase de criação do formulário e na fase de envio do formulário.

Quando você define $form['#action'] = url('https://[url path to external site]');, você está realmente removendo o Drupal dessa última responsabilidade.

Verifique o formulário alterado - você verá que as etiquetas do formulário actionestão definidas no site externo. Quando o formulário é enviado, o navegador envia todos os dados para esse site externo, e o Drupal não pode mais validar ou executar as funções de envio no formulário . Eu acho que isso é o equívoco acontece.

Se você não deseja que o Drupal valide o formulário, grave o envio do formulário da Web ou faça qualquer coisa após o envio do formulário e deixe o site remoto fazer tudo para esse envio, seu código funcionará perfeitamente. Você pode remover a $form['#submit'][] = 'webform_extra_submit';parte e a webform_extra_submitprópria função.

No entanto, se você deseja gravar o envio e enviar os dados para esse site remoto também, faça o seguinte:

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

}
AyeshK
fonte
OBRIGADO por tirar um tempo para esclarecer !! Extremamente útil e eu realmente aprecio isso.
ForTheWin
+1, mas e se eu tiver cálculos no Drupal e postar novamente no controle remoto?
Niksmac
Após a execução da última linha, o usuário será enviado para o site mencionado no $ url?
Neelmeg #
3

Estou tentando encontrar uma maneira de resolver esse problema e finalmente encontrei o módulo Webform Remote Post

O Webform Remote Post é um módulo que funciona ao longo do módulo Webform . Facilita a integração entre Webforms e outros aplicativos da Web (incluindo sistemas como Salesforce e Eloqua).

Espero que poupa alguém horas de procura!

Fazer um
fonte