Webform - Senden Sie Werte von Drupal 7 von an eine externe URL


11

Ich bin ein selbsternannter Neuling beim Erstellen von Formularen in Drupal. Ich habe ein Formular auf einer Drupal 7-Website gehostet (mithilfe des Webformularmoduls) und muss die Formularwerte an eine externe URL senden. Ich habe dies jetzt für eine Weile untersucht und ein benutzerdefiniertes Modul geschrieben, das das Webform-Modul verwendet, um extern mit hook_form_alter und benutzerdefiniertem Submit-Handler / Funktion (Code unten eingefügt) zu senden.

Ich habe die folgenden Seiten als Leitfaden verwendet, aber ich konnte das Formular nicht zum Laufen bringen : https://drupal.org/node/1357136 Verwenden von drupal_http_post () zum Senden an eine externe Site: Was mache ich? falsch?

Kann mich jemand wissen lassen, ob ich auf dem richtigen Weg bin? Jede Anleitung wäre hilfreich!

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

Antworten:


15

In Drupal-Formularen können form_alter-Hooks verwendet werden, um fast alles im Formular zu ändern. Zusätzliche Submit-Handler können behandelt, Validierungen durchgeführt, Elemente hinzugefügt werden usw.

Damit all dies funktioniert, muss Drupal sowohl in der Formularerstellungsphase als auch in der Formularübermittlungsphase die verantwortliche Partei sein.

Wenn Sie festlegen $form['#action'] = url('https://[url path to external site]');, entfernen Sie Drupal tatsächlich von dieser letzteren Verantwortung.

Überprüfen Sie das geänderte Formular. Sie werden sehen, dass das Formular-Tag actionauf die externe Site festgelegt ist. Wenn das Formular gesendet wird, sendet der Browser alle seine Daten an diese externe Site, und Drupal kann die Übermittlungsfunktionen im Formular nicht mehr validieren oder ausführen . Ich denke, das ist das Missverständnis, das passiert.

Wenn Sie nicht möchten, dass Drupal das Formular validiert, die Übermittlung des Webformulars aufzeichnet oder nach der Übermittlung des Formulars etwas unternimmt und die Remote-Site alles für diese Übermittlung erledigt , funktioniert Ihr Code einwandfrei . Sie können das $form['#submit'][] = 'webform_extra_submit';Teil und die webform_extra_submitFunktion selbst entfernen .

Allerdings , wenn Sie nicht möchten , die Vorlage erfassen und die Daten an diesem entfernten Ort einreichen als auch, können Sie es wie folgt tun:

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

}

DANKE, dass Sie sich die Zeit genommen haben, dies zu klären !! Sehr hilfreich und ich schätze es sehr.
ForTheWin

+1, aber was ist, wenn ich Berechnungen in Drupal habe und erneut auf Remote poste?
Niksmac

Wird der Benutzer nach Ausführung der letzten Zeile an die in der $ url angegebene Site gesendet?
Neelmeg

3

Ich habe versucht, einen Weg zu finden, um dieses Problem zu lösen, und schließlich das Webform Remote Post- Modul gefunden

Webform Remote Post ist ein Modul, das entlang des Webform- Moduls arbeitet. Es erleichtert die Integration zwischen Webforms und anderen Webanwendungen (einschließlich Systemen wie Salesforce und Eloqua).

Hoffe, es spart jemandem Stunden des Schauens!

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.