web-dev-qa-db-ja.com

データベースに投稿してからpaypalにリダイレクトする

フォームデータをデータベースに送信してからクライアントをPaypalに送信しようとしています。PaypalはIPNを使用して応答を返送します。

今、私はデータベースに提出するフォームを持っています、私は働いているIPNを持っています、私の問題はリダイレクト部分です。一つのボタンをクリックするだけですべてが完了します。

私のフォームは、現在のページに送信してデータを検証し、データベースに追加します。データはすでにヘッダーに送信されているため、ヘッダーを使用することはできません。

私のオプション/解決策は何ですか。最も簡単な解決策が最善ですが、現時点では何でも構いません。

このような単純な作業には、単純な解決策があると思います。

これがフォームを出力する私のコードです。

function display_form() { ?>
        <div class="culis-module">
            <form action="<?php echo str_replace( '%7E', '~', $_SERVER['REQUEST_URI']); ?>" method="post">      
                <div class="clearfix culis-module-body">
                    <?php 
                    if ( $_POST['culis_add_listing'] == 'Y' && $this->no_errors()) { 
                        $this->addto_db();
                        ?><div class="alert alert-success"><button type="button" class="close" data-dismiss="alert">x</button> <?php _e('Thank You, your company will be listed as soon as payment is processed.')?></div><?php 
                    }

                    if ( $_POST['culis_add_listing'] == 'Y' && !$this->no_errors()) { 
                        $this->prepare_fields('saved'); 
                    } 
                    else {
                        $this->prepare_fields();
                    }?>
                </div>
                <div class="modal-footer">  
                    <button class="btn btn-primary" type="submit" name="culis_add_listing" value="Y">Submit</button>
                    <button class="btn" type="submit" name="form_reset" value="Y">Clear</button>
                </div>
            </form>
        </div>
    <?php 
    }

更新:これが私がやろうとしていることの例です https://stackoverflow.com/a/6753281/1445460

3
Kirill Fuchs

私が1年後にこの質問に遭遇した方法がわからないが、それは答えられていないので...

フォームを自己送信してからPaypalにリダイレクトする代わりに、代わりにPaypalのURLをフォームのアクションとして使用できますが、フォームをPaypalに送信する前にAjaxを使用してフォームデータを保存することができます。 Ajaxレスポンスを使用して送信前にフォームを準備することもできます。いくつかの隠しフィールドを埋める

これが例です:

myform.php

<form id="myform" method="post" action="<?php echo $Paypal_url; ?>">
   <input type="text" ...>
   <input type="hidden" name="my-hidden-field" id="my-hidden-field" value="this is hidden"> 
   ...other form fields...
</form>

saveform.php :Ajaxリクエストを処理し、送信前にフォームを操作するために使用できるレスポンスを返します

<?php 
  if (!empty($_POST)) {
     //save $_POST data to the database
     ...
     //also, fill some data as response
     $response = array('my_hidden_field' => 'this is now filled in');
     //next line returns the response
     echo json_encode($response);  
  }

myform.js :Paypalに送信する前にフォームデータをsaveform.phpに送信する

$j = jQuery.noConflict();

$j(document).ready(function() {
    $j('#myform').submit(submit_myform);
});

function submit_myform() {
    if (!myform_is_valid()) {
        window.location.href = "#myform"; 
        return false;//prevent normal browser submission, to display validation errors
    } else {
        $j.ajax({
           url: 'saveform.php',
           type: 'POST',
           data: $j(this).serialize(),
           dataType:'json', //data type of Ajax response expected from server
           success: myform_success //callback to handle Ajax response and submit to Paypal
        });
       return false;//prevent normal browser submission, since the form is submitted in the callback
   } 
}

function myform_is_valid() {
    $valid = true;
    //validate data; if there's a validation error, set $valid=false and display errors on page
    ...
    return $valid;
}

function myform_success(response) {
    //this is called whenever the ajax request returns a "200 Ok" http header
    //manipulate the form as you wish
    $j('#my-hidden-field').val(response.my_hidden_field);
    //submit the form (to the form's action attribute, i.e $Paypal_url)
    document.forms['myform'].submit(); 
}

Jquery.ajax呼び出しの代わりに、もっと短いものを使用することもできます。

$j.post('saveform.php',$j('#myform').serialize(),myform_success,"json")
1
adelval
$j = jQuery.noConflict();

$j(document).ready(function() {
    $j('#myform').submit(submit_myform);
});

function submit_myform() {
    if (!myform_is_valid()) {
        window.location.href = "#myform"; 
        return false;//prevent normal browser submission, to display validation errors
    } else {
        $j.ajax({
           url: 'saveform.php',
           type: 'POST',
           data: $j(this).serialize(),
           dataType:'json', //data type of Ajax response expected from server
           success: myform_success //callback to handle Ajax response and submit to Paypal
        });
       return false;//prevent normal browser submission, since the form is submitted in the callback
   } 
}

function myform_is_valid() {
    $valid = true;
    //validate data; if there's a validation error, set $valid=false and display errors on page
    ...
    return $valid;
}

function myform_success(response) {
    //this is called whenever the ajax request returns a "200 Ok" http header
    //manipulate the form as you wish
    $j('#my-hidden-field').val(response.my_hidden_field);
    //submit the form (to the form's action attribute, i.e $Paypal_url)
    document.forms['myform'].submit();

enter image description here

0
anita

確かに簡単な解決策があります。私はあなたがフォーム処理をしていてあなたのテンプレートでリダイレクトしようとしていると思いますか?ヘッダが送信される前に、 以前のアクション をフックする必要があります。例:

function wpa66284_process_my_form(){
    if( isset( $_POST['myform'] ) ){
        // process form and redirect
    }
}
add_action( 'init', 'wpa66284_process_my_form' );
0
Milo