web-dev-qa-db-fra.com

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

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 (en utilisant le module de formulaire Web) et j'ai besoin de soumettre les valeurs du formulaire à une URL externe. Je fais des recherches depuis un certain temps maintenant et j'ai écrit module 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/1357136tilisation de drupal_http_post ( ) à soumettre à un site externe: qu'est-ce que je fais mal?

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

Dans les formulaires Drupal, les hooks 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 d'envoi du formulaire.

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

Vérifiez le formulaire modifié - vous verrez que la balise de formulaire action est 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 de soumission dans le formulaire. Je pense que c'est l'idée fausse se produit.

Si vous ne voulez pas Drupal pour valider le formulaire, enregistrez la soumission du formulaire Web ou faites n'importe quoi après la soumission du formulaire et laissez le site distant faire tout pour cette soumission, votre code fonctionnera très bien. Vous pouvez supprimer $form['#submit'][] = 'webform_extra_submit'; partie et le webform_extra_submit fonctionne lui-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);

}
15
AyeshK

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!

3
Makean