웹 양식-Drupal 7에서 외부 URL로 값 제출


11

Drupal에서 양식을 작성하는 데있어 선포 된 초보자입니다. Drupal 7 웹 사이트에서 호스팅하는 양식이 있고 (webform 모듈 사용) 양식 값을 외부 URL에 제출해야합니다. 나는 이것을 잠시 동안 연구하고 있으며 web_form_alter와 사용자 정의 제출 핸들러 / 함수 (아래에 붙여 넣은 코드)를 사용하여 웹 양식 모듈을 사용하여 외부로 제출하는 사용자 정의 모듈을 작성했습니다.

다음 페이지를 가이드로 사용했지만 양식을 사용할 수 없었습니다. https://drupal.org/node/1357136 drupal_http_post ()를 사용하여 외부 사이트에 제출 : 내가하는 일 잘못된?

내가 올바른 길을 가고 있는지 누군가에게 알려줄 수 있습니까? 어떤 안내라도 도움이 될 것입니다!

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

답변:


15

Drupal 양식에서 form_alter 후크는 양식의 거의 모든 것을 변경하는 데 사용될 수 있습니다. 추가 제출 핸들러를 처리하고, 유효성 검증을 수행하며, 요소를 추가 할 수있는 등

그러나이 모든 것이 작동하려면 Drupal은 양식 작성 단계와 양식 제출 단계 모두에서 책임있는 당사자 여야합니다.

설정 $form['#action'] = url('https://[url path to external site]');하면 실제로 후자의 책임에서 Drupal을 제거하는 것입니다.

변경된 양식을 확인하십시오-양식 태그 action가 외부 사이트로 설정되어 있음을 알 수 있습니다. 양식이 제출되면 브라우저는 모든 데이터를 해당 외부 사이트로 전송하며 Drupal은 더 이상 양식의 제출 기능을 검증하거나 수행 할 수 없습니다 . 나는 이것이 오해라고 생각합니다.

Drupal이 양식의 유효성을 검사하지 않기를 원하거나 웹 양식 제출을 기록하거나 양식 제출 후 아무것도 하지 않고 원격 사이트가 해당 제출에 대한 모든 작업을 수행하게하려면 코드가 제대로 작동합니다. $form['#submit'][] = 'webform_extra_submit';부품과 webform_extra_submit기능 자체를 제거 할 수 있습니다 .

그러나 제출을 기록하고 해당 원격 사이트에 데이터를 제출하려는 경우 다음과 같이 수행 할 수 있습니다.

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

}

시간을내어 설명해 주셔서 감사합니다 !! 매우 도움이되고 정말 감사합니다.
ForTheWin

+1이지만 Drupal에서 계산을하고 다시 원격에 게시하면 어떻게됩니까?
niksmac

마지막 줄이 실행 된 후 사용자는 $ url에 언급 된 사이트로 보내 집니까?
neelmeg

3

이 문제를 해결할 수있는 방법을 찾으려고 노력했으며 마침내 Webform Remote Post 모듈을 찾았습니다.

Webform Remote Post는 Webform 모듈 과 함께 작동하는 모듈입니다 . Webform과 다른 웹 애플리케이션 (Salesforce 및 Eloqua와 같은 시스템 포함) 간의 통합을 용이하게합니다.

누군가의 시간을 절약 할 수 있기를 바랍니다!

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.