Formularz internetowy - Prześlij wartości z Drupal 7 z do zewnętrznego adresu URL


11

Jestem samozwańczym nowicjuszem w tworzeniu formularzy w Drupal. Mam formularz hostowany na stronie internetowej Drupal 7 (przy użyciu modułu webform) i muszę przesłać wartości formularza do zewnętrznego adresu URL. Od jakiegoś czasu badam to i napisałem niestandardowy moduł, który używa modułu internetowego do wysyłania na zewnątrz za pomocą hook_form_alter i niestandardowego modułu obsługi / funkcji przesyłania (kod wklejony poniżej).

Korzystam z poniższych stron jako przewodników, ale nie udało mi się uruchomić formularza: https://drupal.org/node/1357136 Używanie drupal_http_post () do przesyłania na zewnętrzną stronę: Co robię źle?

Czy ktoś może mi powiedzieć, czy jestem na dobrej drodze? Wszelkie wskazówki byłyby pomocne!

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

Odpowiedzi:


15

W formularzach Drupal haczyki form_alter mogą służyć do zmiany prawie wszystkiego w formularzu. Można obsługiwać dodatkowe procedury obsługi przesyłania, sprawdzanie poprawności, dodawanie elementów itp.

Ale aby wszystkie z nich działały, Drupal musi być stroną odpowiedzialną zarówno w fazie budowy formularza, jak i w fazie przesyłania formularza.

Kiedy ustawiasz $form['#action'] = url('https://[url path to external site]');, w rzeczywistości usuwasz Drupala z tej ostatniej odpowiedzialności.

Sprawdź zmieniony formularz - zobaczysz, że znacznik formularza actionjest ustawiony na zewnętrzną stronę. Po przesłaniu formularza przeglądarka wysyła wszystkie swoje dane do tej witryny zewnętrznej, a Drupal nie może już sprawdzać poprawności ani wykonywać funkcji przesyłania w formularzu . Myślę, że tak się dzieje.

Jeśli nie chcesz, aby Drupal sprawdził poprawność formularza, nagrał formularz internetowy lub zrobił cokolwiek po przesłaniu formularza i pozwolił zdalnej stronie zrobić wszystko dla tego formularza , Twój kod będzie działał dobrze. Możesz usunąć $form['#submit'][] = 'webform_extra_submit';część i webform_extra_submitsamą funkcję.

Jeśli jednak chcesz zarejestrować przesłanie i przesłać dane również do tej zdalnej witryny, możesz to zrobić w następujący sposób:

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

}

DZIĘKUJEMY za poświęcenie czasu na wyjaśnienia !! Niezwykle pomocny i naprawdę to doceniam.
ForTheWin,

+1, ale co, jeśli mam obliczenia w Drupal i ponownie opublikuję wiadomość na odległość?
niksmac,

Czy po wykonaniu ostatniego wiersza użytkownik zostanie wysłany do strony wymienionej w $ url?
neelmeg 19.04.16

3

Próbowałem znaleźć sposób na rozwiązanie tego problemu i wreszcie znalazłem moduł Webform Remote Post

Webform Remote Post to moduł działający wzdłuż modułu Webform . Ułatwia integrację między formularzami internetowymi a innymi aplikacjami internetowymi (w tym systemami takimi jak Salesforce i Eloqua).

Mam nadzieję, że pozwoli to zaoszczędzić komuś godziny szukania!

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.