フォームデータをデータベースに送信してからクライアントを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
私が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")
$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();
確かに簡単な解決策があります。私はあなたがフォーム処理をしていてあなたのテンプレートでリダイレクトしようとしていると思いますか?ヘッダが送信される前に、 以前のアクション をフックする必要があります。例:
function wpa66284_process_my_form(){
if( isset( $_POST['myform'] ) ){
// process form and redirect
}
}
add_action( 'init', 'wpa66284_process_my_form' );