IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

JavaScript Discussion :

[AJAX] Construction d'un preloader pendant l'exécution d'un php


Sujet :

JavaScript

  1. #1
    Membre averti Avatar de renaud26
    Homme Profil pro
    Webmaster
    Inscrit en
    Mars 2003
    Messages
    1 365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Mars 2003
    Messages : 1 365
    Points : 436
    Points
    436
    Par défaut [AJAX] Construction d'un preloader pendant l'exécution d'un php
    Bonjour à tous,


    Je ne sais pas si je suis dans la bonne section, vu que ma question porte sur la meilleure technique à adopter... J'ai crée un petit script d'envoi de newsletter et je voudrais afficher un message d'attente, une barre de progression...pendant que PHP fait le boulot et envoie les vagues de mails. Ceci au lieu de la page toute blanche. J'ai lu plein de tutos, essayé des scripts JS, DHTML, AJAX...mais rien ne m'a satisfait puisque en générale le message "envoi en cours, merci de patienter" s'affiche en même temps que le résultat du traitement....donc trop tard.

    Quelqu'un a une idée et peut me dire vers quoi je pourrais creuser ?
    Merci à lui.
    Bonne journée.

  2. #2
    Membre expérimenté
    Avatar de ryan
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2003
    Messages
    956
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2003
    Messages : 956
    Points : 1 316
    Points
    1 316
    Billets dans le blog
    1
    Par défaut
    Yop!

    Si tes adresses email sont dans une BDD, c'est assez facile.

    Dans ta page, tu boucles sur le résultat de ton query qui comporte donc toutes tes adresses email. Pour chaque adresse, tu écris un formulaire avec des champs cachés qui contiennent l'adresse email et les autres paramètre (l'index du mail envoyé, le nombre total de mail, le titre et le body de l'email, par exemple). La target du formulaire est une iframe. Dans cette iframe,tu as le code pour envoyer ta news letter, et en connaissant le nombre total de mail et l'index du mail couramment envoyé, tu peux construire une image qui réflète le % de mail envoyés par rapport au total de mails à envoyer.

  3. #3
    Membre averti Avatar de renaud26
    Homme Profil pro
    Webmaster
    Inscrit en
    Mars 2003
    Messages
    1 365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Mars 2003
    Messages : 1 365
    Points : 436
    Points
    436
    Par défaut
    Merci de cette suggestion...que je vais tenter, même si ça reste un peu flou...j'ai notamment peur que cette petite manip allourdisse considérablement le script...

    Bonne journée.

  4. #4
    Rédacteur
    Avatar de marcha
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2003
    Messages
    1 571
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 571
    Points : 2 351
    Points
    2 351
    Par défaut
    Salut,

    La technique que j'utilise est la suivante:

    une page pour le traitement d'envoi global, tel que tu l'a déjà fait.
    dans cette page tu met à jour un compteur dans la base de donnée
    dans une table prévue pour ça, ce compteur indique le pourcentage
    effectué par exemple.

    dans une autre page php tu lis juste ce compteur.

    enfin, dans ta page d'envoi, tu lance d'abord une requête ajax qui
    démarre le processus d'envoi, puis tu lance des requêtes régulières
    (1 ou 2 fois par seconde) vers la 2ème page pour connaitre la progression.

  5. #5
    Membre averti Avatar de renaud26
    Homme Profil pro
    Webmaster
    Inscrit en
    Mars 2003
    Messages
    1 365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Mars 2003
    Messages : 1 365
    Points : 436
    Points
    436
    Par défaut
    Merci également de ta suggestion.

    enfin, dans ta page d'envoi, tu lance d'abord une requête ajax
    Ca il va falloir que je me documente serieusement parce que je suis à 0.


    Une piste de plus à creuser...

  6. #6
    Expert confirmé
    Avatar de RomainVALERI
    Homme Profil pro
    POOête
    Inscrit en
    Avril 2008
    Messages
    2 652
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : POOête

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 652
    Points : 4 164
    Points
    4 164
    Par défaut une autre voie ?
    Si jamais dans ton cas la progression exacte n'est pas nécessaire (les n% accomplis), il y a éventuellement une solution bien plus rudimentaire que les excellentes solutions déjà proposées, qui serait la suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
    var xhr = getXhr(); // voir note ci-dessous*
    xhr.open("GET",mesDonnees.xml?monParam=uneValeur,true);
    xhr.onReadyState = function()
    {
       if (xhr.readyState == 1)
       {
          // ici gestion de l'attente, exemple (minimaliste) :
          var zoneAffichable = document.getElementById('idElementChoisiPourAfficher');
          zoneAffichable.value = "Veuillez patienter...traitement en cours"
       }
       else if (xhr.readyState == 4 && xhr.status == 200)
       {
          // ici code de succès de ton traitement
          // et effacement du message d'attente
       }
    }
    xhr.send(null);
    *J'ose espérer que tu t'es écrit/récupéré une petite méthode getXhr() qui crée un objet XMLHTTPRequest selon le navigateur, bien entendu

  7. #7
    Membre expérimenté
    Avatar de ryan
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2003
    Messages
    956
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2003
    Messages : 956
    Points : 1 316
    Points
    1 316
    Billets dans le blog
    1
    Par défaut
    Yop!

    Citation Envoyé par renaud26 Voir le message
    Merci de cette suggestion...que je vais tenter, même si ça reste un peu flou...
    Je vais essayer de préciser les choses...

    Première page:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
     
    <html>
    <body>
    <?php
     
    // on suppose que tu as effectué la connexion à la BDD
    $query = "SELECT email FROM mytable";
    $rs = mysql_query($query);
     
    // le nb total d'emails à envoyer
    $total = mysql_num_rows($rs);
     
    // on initialise un compteur
    $count = 0;
     
    while ($row = mysql_fetch_assoc($rs)) 
    {
      $count = $count + 1;
      echo "<form name='myform' action='sendmail.php' method=post target='myframe'>";
      echo "<input type=hidden name='total' value='" . $total . "'>";  
      echo "<input type=hidden name='count' value='" . $count . "'>";
      echo "<input type=hidden name='email' value='" . $row["email"] . "'>";  
      echo "<input type=hidden name='titre' value='ceci est le titre du mail'>";  
      echo "<input type=hidden name='body' value='ceci est le body du mail'>";    
      echo "</form>"; 
      echo "<script>document.forms.myform.submit();</script>"; 
    }
    ?>
    <iframe name="myframe" height=100 width=400>
    </iframe>
    </body>
    </html>
    La page sendmail.php

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    <html>
    <body>
    <?php
     
     // progression de la tâche en mode texte
     
     echo "Sending email " . $_POST["count"]  . " on " . $_POST["total"];
     
     // ensuite tu places le code qui expédie l'email....
     
     ...
     
    ?>
    </body>
    </html>
    Pas testé, et comme il se fait tard, il se peut qu'il y ait des erreurs grossières, mais le principe est là.

  8. #8
    Membre averti Avatar de renaud26
    Homme Profil pro
    Webmaster
    Inscrit en
    Mars 2003
    Messages
    1 365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Mars 2003
    Messages : 1 365
    Points : 436
    Points
    436
    Par défaut
    J'ose espérer que tu t'es écrit/récupéré une petite méthode getXhr() qui crée un objet XMLHTTPRequest selon le navigateur, bien entendu
    Euh....à vrai dire...non.
    Mais je vais plonger dans les tutos AJAX...promis !

    A Ryan : oui, merci, ça me paraît tout à fait clair, maintenant. Je vais tester ce système immédiatement.

    Bonne journée à tous...et courage à ceux qui sont sous la neige...

  9. #9
    Expert confirmé
    Avatar de RomainVALERI
    Homme Profil pro
    POOête
    Inscrit en
    Avril 2008
    Messages
    2 652
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : POOête

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 652
    Points : 4 164
    Points
    4 164
    Par défaut
    Citation Envoyé par renaud26 Voir le message
    Euh....à vrai dire...non.
    Exemple très classique :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
     
    function getXhr()
    {
       if(window.XMLHttpRequest) // Firefox et autres
          var getXmlHttpRequest = new XMLHttpRequest();
       else if(window.ActiveXObject)
       { // Internet Explorer
          try
          {
             getXmlHttpRequest = new ActiveXObject("Msxml2.XMLHTTP");
          }
          catch(e)
          {
             getXmlHttpRequest = new ActiveXObject("Microsoft.XMLHTTP");
          }
       }
       else
       { // XMLHttpRequest non supporté par le navigateur
          alert("Votre navigateur ne supporte pas les objets XMLHTTPRequest...");
          getXmlHttpRequest = false;
       }
       return getXmlHttpRequest;
    }
    Citation Envoyé par renaud26 Voir le message
    ...et courage à ceux qui sont sous la neige...
    Merci bien du fin fond de la Lorraine

Discussions similaires

  1. ça rentre pas dans la boucle pendant l'exécution
    Par djouahra.karim1 dans le forum Bases de données
    Réponses: 9
    Dernier message: 15/01/2005, 15h41
  2. Empêcher la copie d'un prog pendant son exécution
    Par JuanLopez1966 dans le forum Assembleur
    Réponses: 3
    Dernier message: 09/09/2004, 19h49
  3. Créer une fonction mathématique pendant l'exécution
    Par zeprogrameur dans le forum Langage
    Réponses: 5
    Dernier message: 09/07/2004, 11h36
  4. Published property d'un compo conservées pendant l'exécution
    Par bobby-b dans le forum Composants VCL
    Réponses: 2
    Dernier message: 04/09/2003, 10h15

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo