it-swarm.com.de

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

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

Ich habe die folgenden Seiten als Leitfaden verwendet, aber ich konnte das Formular nicht zum Laufen bringen: https://drupal.org/node/1357136Verwenden von drupal_http_post ( ) an eine externe Seite senden: 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'], '', '&'));
}
?>
11
ForTheWin

In Drupal Formularen können form_alter-Hooks verwendet werden, um fast alles im Formular zu ändern. Zusätzliche Übermittlungshandler können behandelt, die Validierung kann durchgeführt, Elemente können hinzugefügt werden usw.

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

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

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

Wenn Sie nicht möchten, dass Drupal das Formular validiert, zeichnen Sie die Übermittlung des Webformulars auf oder tun Sie irgendetwas nach der Übermittlung des Formulars und lassen Sie die Remote-Site alles) tun Für diese Übermittlung funktioniert Ihr Code einwandfrei. Sie können den Teil $form['#submit'][] = 'webform_extra_submit'; und die Funktion webform_extra_submit selbst entfernen.

jedoch Wenn Sie die Übermittlung aufzeichnen und die Daten auch an diesen Remote-Standort senden möchten, können Sie dies folgendermaßen 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);

}
15
AyeshK

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

Webform Remote Post ist ein Modul, das mit dem Modul Webform zusammenarbeitet. Es erleichtert die Integration zwischen Webforms und anderen Webanwendungen (einschließlich Systemen wie Salesforce und Eloqua).

Hoffe, es spart jemandem Stunden des Schauens!

3
Makean