Formulario web: envíe valores desde Drupal 7 desde una url externa

11

Soy un novato autoproclamado para crear formularios en Drupal. Tengo un formulario alojado en un sitio web de Drupal 7 (usando el módulo de formulario web) y necesito enviar los valores del formulario a una url externa. He estado investigando esto por un tiempo ahora y escribí un módulo personalizado que usa el módulo de formulario web para enviar externamente usando hook_form_alter y controlador / función de envío personalizado (código pegado a continuación).

He estado usando las siguientes páginas como guías, pero no he podido hacer que el formulario funcione: https://drupal.org/node/1357136 Uso de drupal_http_post () para enviarlo a un sitio externo: ¿Qué estoy haciendo? ¿incorrecto?

¿Alguien puede decirme si estoy en el camino correcto? ¡Cualquier orientación sería útil!

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

Respuestas:

15

En los formularios de Drupal, los ganchos de form_alter se pueden usar para cambiar casi cualquier cosa en el formulario. Se pueden manejar controladores de envío adicionales, se puede hacer la validación, se pueden agregar elementos, etc.

Pero para que todo esto funcione, Drupal debe ser la parte responsable tanto en la fase de creación del formulario como en la fase de envío del formulario.

Cuando configuras $form['#action'] = url('https://[url path to external site]');, estás eliminando a Drupal de esa última responsabilidad.

Verifique el formulario modificado: verá que la etiqueta del formulario actionestá configurada en el sitio externo. Cuando se envía el formulario, el navegador envía todos sus datos a ese sitio externo y Drupal ya no puede validar o realizar funciones de envío en el formulario . Creo que esta es la idea errónea que sucede.

Si no desea que Drupal valide el formulario, registre el envío del formulario web o haga algo después del envío del formulario y deje que el sitio remoto haga todo para ese envío, su código funcionará bien. Puede eliminar $form['#submit'][] = 'webform_extra_submit';parte y la webform_extra_submitfunción en sí.

Sin embargo, si desea registrar el envío y enviar los datos a ese sitio remoto también, puede hacerlo así:

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

}
AyeshK
fuente
¡GRACIAS por tomarte el tiempo de aclarar! Muy útil y realmente lo aprecio.
ForTheWin
+1, pero ¿qué pasa si tengo cálculos en Drupal y vuelvo a publicar en remoto?
niksmac
Después de que se ejecute la última línea, ¿se enviará al usuario al sitio mencionado en $ url?
neelmeg
3

He estado tratando de encontrar una manera de abordar este problema y finalmente encontré el módulo Webform Remote Post

Webform Remote Post es un módulo que funciona junto con el módulo Webform . Facilita la integración entre Webforms y otras aplicaciones web (incluidos sistemas como Salesforce y Eloqua).

¡Espero que ahorre a alguien horas de mirar!

Hacer una
fuente