Bonjour,

Sur mon site cakePHP je viens de mettre un login en AJAX.

Ce que je fais

Lorsque le retour du password et OK je fais un window.location.href
et une fois la page chargée j'aimerai afficher un popup de type toastr pour afficher différentes informations.

$.post(linkAction,phpData,function(data){
                    if(data==false){
                         swal("Erreur authentification","Veuillez vérifier votre mot de passe","error") 
                    }else{
                        //welcome

                            toastr.options = {
                                        closeButton: true,
                                        progressBar: true,
                                        timeOut: 10000,
                                        onclick: null
                                    };
                            // Display a success toast, with a title
                            window.location.href=basepath+"/book";
                            toastr.success('Bienvenue sur app',data['nom_complet'])
                    }

            },"json");

Ce que j'obtiens

le problème c'est que le comportement est asynchrone donc la page commence à charger, le popup toastr s'affiche mais des que la page s'affiche le popup disparait... je ne sais pas trop comment faire

J'aimerai vraiment pouvoir afficher des popups avec différentes informations une fois que la personne s'est connectée... auriez vous une idée ??

Merci par avance

12 réponses


$.post(linkAction,phpData)
  .done(function( data ) {
    /*
         ici, les données sont chargées
    */
  });

@pluche

Pierre

jey1985
Auteur

Quelle différence ?

tu regardes le titre de ton post.
done = terminé.
@plus

Pierre

Le .done permet de réaliser de façon à ce que ton script soit exécuté à la fin du chargement

jey1985
Auteur

.done() fait la mme chose que ce que j'ai fait ça execute le code au retour de mon appel ajax, ça ne change rien à mon problème malheureusement.

Mon problème c'est de déclencher le popup une fois que window.location.href est terminé et non pas de déclencher des actions quelqonques au retour de ma requete ajax, ça ça fonctionne.

si je ne m'abuse, après le window.location, le data est perdu, nan ?

@plus

jey1985
Auteur

non car le window.location est asynchrone, le toastr.popup() se fait avant que le window.location ait terminé

window.location asynchrone ??????????
je ne crois pas, il charge la page, donc, remplace la page déjà chargée

@plus.

Pierre

jey1985
Auteur

oui,
par contre le laps de temps qu'il met pour faire son chargement, toastr à largemet le temps de s'afficher... avant que le chargement de page se soit effectué. C'est le comportement que je constate en tout cas

setTimeout(function(){ window.location.href=basepath+"/book"; }, 4000);
toastr.success('Bienvenue sur app',data['nom_complet']);

@pluche

Pierre

jey1985
Auteur

En fait, si je résume mon probleme:
1) authentification en ajax
2) redirection
3) une fois redirigé je veux déclencher une ou plusieurs actions qui afficheront un ou plusieurs popups.

Le problème: je veux que ces actions soit déclenchées uniquement aprés le login et pas chaque fois que j'arrive sur la page accueil sinon à chaque F5 les popups s'afficheront.

jey1985
Auteur

Bonsoir,
J'ai trouvé une solution avec les sessionStorage que je viens de découvrir:

Voici la solution mis en place

$(function() {        
        var basepath=$("#basepath").attr("data-path");
        toastr.options = {
                closeButton: true,
                progressBar: true,
                timeOut: 10000,
                onclick: null
            }; 

        if (sessionStorage.getItem('advertOnce') !== 'true') {

            $.post(basepath+"/Users/usersInfoAjax/",{},function(data){

                //bienvenue popup
                toastr.success('Bienvenue sur ...blabla', data["nom"]);

                //recrutement en cours
                if(data["nbrecrue"]>0){                           
                    toastr.warning('Vous avez '+ data["nbrecrue"] +' recrutements en cours.\nPouvez vous renseigner leurs status?', 
                                    'Recrutements',
                                    {timeOut: 15000}
                                    );      
                }  

            },"json");

            sessionStorage.setItem('advertOnce','true');    

        }
});

Un sessionStorage.clear() est fait avant l'appel au login .$post()...