web-dev-qa-db-fra.com

Le formulaire n'est pas soumis lors du deuxième appel.

Le problème suivant me préoccupe depuis plus d'une semaine, alors veuillez excuser la description longue. Je veux que ce soit aussi précis et clair que possible:

J'utilise le plug-in "simplr registration form" pour enregistrer de nouveaux utilisateurs. Je dois ajouter au formulaire un champ "adresse" à remplir par les utilisateurs. Lorsque vous cliquez sur le bouton d'envoi, l'adresse doit être envoyée à l'API Google Maps et recevoir la latitude et la longitude, qui doivent ensuite être enregistrées dans wpdb avec le reste des données de l'utilisateur. Pour cela, j'ai ajouté ce qui suit à la fonction php qui construit le formulaire html:
- champ de saisie de l'adresse
- 2 champs cachés pour le lat & long
- fonction jquery qui répond au bouton de soumission et est supposée le faire après que le bouton a été cliqué, mais avant que le formulaire ne soit réellement soumis et géré par la fonction php du plugin.

Étant donné que l'utilisation de l'API Google Maps est asynchrone pour que le travail soit effectué, je dois procéder comme suit:

Ecrivez une fonction qui répond au clic de soumission.
Cette fonction devrait empêcher la soumission du formulaire et appeler une autre fonction qui effectue le travail dans Google Maps et, une fois que celle-ci est terminée, soumet le formulaire.
Le problème réside dans la deuxième soumission. Cela n'arrive pas.
J'ai essayé différentes méthodes (avec jQuery):
- une fonction de soumission qui s’appelle elle-même avec l’utilisation d’un indicateur qui indique à la première itération de ne pas soumettre et à la seconde. Le code fonctionne bien jusqu'à la deuxième itération, qui ne fonctionne tout simplement pas.
- une fonction de soumission qui appelle "this.submit ()". Encore une fois, "this.submit ()" ne provoque pas l'envoi du formulaire.
- une fonction de clic qui devrait répondre à la soumission sur laquelle on clique, effectuer le travail dans Google, puis appeler la fonction de soumission. Ici, même la fonction de clic ne se déclenche pas du tout.

// This is the button's definition:
$form .=  apply_filters('simplr-reg-submit', '<input type="submit" name="submit-reg" id="submit-reg" value="Register" class="submit button">');

// This is the php code that starts handling the submitted form 
if(isset($_POST['submit-reg'])) {

Voici un exemple pour l'une de mes tentatives:

function codeAddress(callback)
{
    // do the google stuff
    // when finished submit the form
    $('#simplr-reg').get(0).submit();

    // it's all being done except for the submit part
}

$('#simplr-reg').submit(function(event)
{
    codeAddress(function(success){}); //callback from googlemaps
    event.preventDefault();
}

// Here's a simplified example:
$('#simplr-reg').submit(function(event)
{
    this.submit(); //doesn't cause the form to submit
    event.preventDefault();
});

Si je n'utilise pas event.preventDefault () et que je ne le soumets pas à la première itération, il envoie correctement.

J'ai essayé de résoudre ceci avec l'aide des gars de stackoverflow mais personne ne pouvait trouver ce qui n'allait pas, alors je suppose qu'il a quelque chose à voir avec WordPress ou le plugin.

1
Ash

La fonction php qui gère les valeurs soumises dans ce plugin vérifie d'abord si la valeur du bouton isset. Lorsque vous utilisez l'original, envoyez-le. Lorsque vous utilisez preventDefault() et que vous appelez ensuite submit(), ce n'est pas le cas et le php ne gère pas le formulaire soumis, mais le reconstruit. Pour résoudre ce problème, je viens d’ajouter à la isset() une vérification si les valeurs lat/long sont vraies. Cela a fait le tour.

2
Ash

Je pense que cette question n'appartient pas à ici, mais n'en reste pas moins.

OK Ash, essayez votre logique comme ceci:

<script>
var wasGoogleFetchSuccess = 0;

$('#simplr-reg').submit(function() {

    if(wasGoogleFetchSuccess == 1) {
        return true; // I can now submit form as normal
    } else {
        goDoGoogleMapAddressSearch();
        return false; // dont submit form this time round
    }

});

function goDoGoogleMapAddressSearch() {
    //Do google map search
    //On success or completion do the following:
    $("blah blah blah").success(function() { // Just an example
        wasGoogleFetchSuccess = 1;
        $('#simplr-reg').submit();
    });
}
</script>
0
Brady