Webform - Drupal 7'den harici URL'ye değerleri gönderme


11

Ben Drupal'da formlar yaratma konusunda kendi kendini ilan etmiş bir acemiyim. Drupal 7 web sitesinde (webform modülünü kullanarak) barındırılan bir form var ve form değerlerini harici bir URL'ye göndermeniz gerekiyor. Bunu bir süredir araştırıyorum ve hook_form_alter ve özel gönderme işleyicisi / işlevi (aşağıda yapıştırılan kod) kullanarak harici olarak göndermek için webform modülünü kullanan özel bir modül yazdım.

Aşağıdaki sayfaları kılavuz olarak kullanıyorum, ancak formu çalıştıramadım: https://drupal.org/node/1357136 Harici siteye göndermek için drupal_http_post () yöntemini kullanma: Ne yapıyorum yanlış?

Birisi bana doğru yolda olup olmadığımı söyleyebilir mi? Herhangi bir rehberlik yardımcı olacaktır!

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

Yanıtlar:


15

Drupal formlarında, form_alter kancaları formdaki hemen hemen her şeyi değiştirmek için kullanılabilir. Ek gönderme işleyicileri işlenebilir, doğrulama yapılabilir, öğeler eklenebilir vb.

Ancak bunların hepsinin çalışması için Drupal'ın hem form oluşturma aşamasında hem de form gönderme aşamasında sorumlu taraf olması gerekir.

Ayarladığınızda $form['#action'] = url('https://[url path to external site]');, aslında Drupal'ı bu ikinci sorumluluktan çıkarıyorsunuz.

Değiştirilen formu kontrol edin - form etiketlerinin actionharici siteye ayarlandığını göreceksiniz . Form gönderildiğinde, tarayıcı tüm verilerini bu harici siteye gönderir ve Drupal artık formdaki gönderme işlevlerini doğrulayamaz veya gerçekleştiremez . Bence bu yanlış anlama oluyor.

Drupal'ın formu doğrulamasını, web formu gönderimini kaydetmesini veya form gönderildikten sonra bir şey yapmasını istemiyorsanız ve uzak sitenin bu gönderim için her şeyi yapmasına izin verirseniz , kodunuz iyi çalışır. $form['#submit'][] = 'webform_extra_submit';Parçayı ve webform_extra_submitişlevin kendisini kaldırabilirsiniz .

Ancak, gönderimi kaydetmek ve bu uzak siteye de veri göndermek istiyorsanız, bunu şu şekilde yapabilirsiniz:

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

}

Açıklamak için zaman ayırdığınız için teşekkür ederiz !! Son derece yararlı ve gerçekten takdir ediyorum.
ForTheWin

+1, ama ya Drupal'da hesaplamalar yaparsam ve uzaktan kumandaya gönderirsem ne olur?
niksmac

Son satır yürütüldükten sonra, kullanıcı $ url'de belirtilen siteye gönderilecek mi?
neelmeg

3

Bu sorunu çözmek için bir yol bulmaya çalışıyorum ve sonunda Webform Remote Post modülünü buldum

Webform Remote Post, Webform modülü boyunca çalışan bir modüldür. Web formları ve diğer web uygulamaları (Salesforce ve Eloqua gibi sistemler dahil) arasındaki entegrasyonu kolaylaştırır.

Umarım saatlerce bakmayı kurtarır!

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.