Webform - Soumettre les valeurs de Drupal 7 de à l'url externe

11

Je suis un novice autoproclamé de la création de formulaires dans Drupal. J'ai un formulaire hébergé sur un site Web Drupal 7 (à l'aide du module de formulaire Web) et je dois soumettre les valeurs du formulaire à une URL externe. Je fais des recherches depuis un certain temps maintenant et j'ai écrit un module personnalisé qui utilise le module Webform pour soumettre en externe en utilisant hook_form_alter et un gestionnaire / fonction de soumission personnalisé (code collé ci-dessous).

J'ai utilisé les pages suivantes comme guides, mais je n'ai pas réussi à faire fonctionner le formulaire: https://drupal.org/node/1357136 Utilisation de drupal_http_post () pour soumettre à un site externe: Qu'est-ce que je fais faux?

Quelqu'un peut-il me dire si je suis sur la bonne voie? Toute orientation serait 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'], '', '&'));
}
?>
Pour la victoire
la source

Réponses:

15

Dans les formulaires Drupal, les crochets form_alter peuvent être utilisés pour changer presque n'importe quoi dans le formulaire. Des gestionnaires de soumission supplémentaires peuvent être gérés, la validation peut être effectuée, des éléments peuvent être ajoutés, etc.

Mais pour que tout cela fonctionne, Drupal doit être la partie responsable à la fois dans la phase de création du formulaire et dans la phase de soumission du formulaire.

Lorsque vous définissez $form['#action'] = url('https://[url path to external site]');, vous retirez réellement Drupal de cette dernière responsabilité.

Vérifiez le formulaire modifié - vous verrez que la balise du formulaire actionest définie sur le site externe. Lorsque le formulaire est soumis, le navigateur envoie toutes ses données à ce site externe et Drupal ne peut plus valider ou exécuter des fonctions d' envoi dans le formulaire . Je pense que c'est l'idée fausse qui se produit.

Si vous ne voulez pas que Drupal valide le formulaire, enregistre la soumission du formulaire Web ou fasse quoi que ce soit après la soumission du formulaire et laisse le site distant faire tout pour cette soumission, votre code fonctionnera très bien. Vous pouvez supprimer une $form['#submit'][] = 'webform_extra_submit';partie et la webform_extra_submitfonction elle-même.

Cependant, si vous souhaitez enregistrer la soumission et soumettre également les données à ce site distant, vous pouvez le faire comme ceci:

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
la source
MERCI d'avoir pris le temps de clarifier !! Extrêmement utile et je l'apprécie vraiment.
ForTheWin
+1, mais que se passe-t-il si j'ai des calculs dans Drupal et que je poste à nouveau sur la télécommande?
niksmac
Après l'exécution de la dernière ligne, l'utilisateur sera-t-il envoyé vers le site mentionné dans l'url $?
neelmeg
3

J'ai essayé de trouver un moyen de résoudre ce problème et j'ai finalement trouvé le module Webform Remote Post

Webform Remote Post est un module qui fonctionne avec le module Webform . Il facilite l'intégration entre les formulaires Web et d'autres applications Web (y compris des systèmes comme Salesforce et Eloqua).

J'espère que cela fera gagner des heures à quelqu'un!

Faire un
la source