Pregunta:
Estoy tratando de enviar los datos del formulario a la base de datos y luego enviar al cliente a PayPal, que usará IPN para enviar una respuesta.
Ahora mismo tengo el formulario enviándolo a la base de datos, tengo el IPN funcionando, mi problema es la parte de redireccionamiento. Quiero que todo se haga con el clic de un botón …
Mi formulario simplemente se envía a la página actual donde valida los datos y los agrega a la base de datos. Parece que no puedo usar el encabezado porque los datos ya se han enviado al encabezado.
Cuáles son mis opciones / soluciones. La solución más simple sería la mejor, pero estoy abierto a cualquier cosa en este momento.
Para una tarea tan simple, pensaría que habría una solución simple …
Aquí está mi código que imprime el formulario:
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
}
Actualización: aquí hay un ejemplo de lo que estoy tratando de hacer https://stackoverflow.com/a/6753281/1445460
Respuesta:
No estoy seguro de cómo me encontré con esta pregunta un año después, pero como no tiene respuesta …
En lugar de autoenviar el formulario y luego redirigirlo a Paypal, puede usar la URL de PayPal como acción de su formulario, pero use Ajax para guardar los datos del formulario antes de enviarlo a Paypal. También puede utilizar la respuesta Ajax para preparar el formulario antes de enviarlo, por ejemplo, rellenando algunos campos ocultos
He aquí un ejemplo:
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 : procesa la solicitud Ajax y devuelve una respuesta que se puede usar para manipular el formulario antes de enviarlo
<?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 : envía los datos del formulario a saveform.php antes de enviarlos a paypal
$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();
}
En lugar de la llamada jquery.ajax, también puede usar la más corta:
$j.post('saveform.php',$j('#myform').serialize(),myform_success,"json")