Webform: invia i valori di Drupal 7 dall'URL esterno


11

Sono un novizio autoproclamato nella creazione di forme in Drupal. Ho un modulo ospitato su un sito Web Drupal 7 (utilizzando il modulo webform) e devo inviare i valori del modulo a un URL esterno. Sto cercando questo da un po 'di tempo e ho scritto un modulo personalizzato che utilizza il modulo webform per inviare esternamente usando hook_form_alter e gestore / funzione di invio personalizzato (codice incollato di seguito).

Ho usato le seguenti pagine come guide, ma non sono riuscito a far funzionare il modulo: https://drupal.org/node/1357136 Uso di drupal_http_post () per inviare a un sito esterno: Cosa sto facendo sbagliato?

Qualcuno può farmi sapere se sono sulla strada giusta? Qualsiasi consiglio sarebbe utile!

<?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'], '', '&'));
}
?>

Risposte:


15

Nei moduli Drupal, gli hook form_alter possono essere usati per cambiare praticamente qualsiasi cosa nel form. È possibile gestire gestori di invio aggiuntivi, eseguire la convalida, aggiungere elementi, ecc.

Ma affinché tutto funzioni, Drupal deve essere la parte responsabile sia nella fase di compilazione del modulo sia nella fase di invio del modulo.

Quando imposti $form['#action'] = url('https://[url path to external site]');, stai effettivamente rimuovendo Drupal da quest'ultima responsabilità.

Controlla il modulo modificato: vedrai che il tag del modulo actionè impostato sul sito esterno. Quando il modulo viene inviato, il browser invia tutti i suoi dati a quel sito esterno e Drupal non può più convalidare o eseguire le funzioni di invio nel modulo . Penso che questo sia il malinteso che accade.

Se non desideri che Drupal convalidi il modulo, registri l'invio del modulo web o esegua qualsiasi operazione dopo l'invio del modulo e consenti al sito remoto di fare tutto per tale invio, il codice funzionerà perfettamente. È possibile rimuovere la $form['#submit'][] = 'webform_extra_submit';parte e la webform_extra_submitfunzione stessa.

Tuttavia, se si desidera registrare l'invio e inviare i dati anche a quel sito remoto, è possibile farlo in questo modo:

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

}

GRAZIE per aver dedicato del tempo a chiarire !! Estremamente utile e lo apprezzo molto.
ForTheWin,

+1, ma cosa succede se ho dei calcoli in Drupal e invio di nuovo sul telecomando?
Niksmac,

Dopo l'esecuzione dell'ultima riga, l'utente verrà inviato al sito indicato in $ url?
Neelmeg,

3

Ho cercato di trovare un modo per affrontare questo problema e ho finalmente trovato il modulo Webform Remote Post

Webform Remote Post è un modulo che funziona insieme al modulo Webform . Facilita l'integrazione tra Webform e altre applicazioni Web (inclusi sistemi come Salesforce ed Eloqua).

Spero che salvi ore a guardare qualcuno!

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.