Afficher progression traitement

Réduire
X
 
  • Filtrer
  • Heure
  • Afficher
Tout effacer
nouveaux messages

  • Afficher progression traitement

    Bonjour, je développe des applis webs spécifiques sur le framework Joomla.
    J'ai dans certains modèles des traitements de mise à jour de données importantes (sur mysql) et donc la page peut prendre plusieurs dizaines de secondes avant de se recharger.

    J'aimerai pouvoir faire comment dans certains cas en admin afficher une simple barre de progression, ou ne serait ce qu'un état d'avancement de 0 à 100 dans mon traitement (via Ajax ?)

    Je ne suis malheureusement pas tres calé en Ajax, j'ai toujours eu du mal à comprendre (je suis un vieux programmeur oui ), et donc j'aimerai trouver un tuto ou un exemple de développement de ce type sous Joomla.

    En gros il me faudrait un code de ce genre pour tester et l'adapter ensuite

    <?php
    for ($i=0; $i<=100; $i++)
    AfficherPRogression ($i);
    Développement ERP Joomla 2.5

  • #2
    Re : Afficher progression traitement

    Bonjour

    Je vais te rassurer : c'est sacrément compliqué à faire ;-) (oui, désolé, je suis sérieux)

    Je l'ai fait et c'était galère.

    Rien à faire, faut faire de l'ajax.

    Pour la progress bar elle-même tu peux partir sur Bootstrap : http://getbootstrap.com/components/#progress

    Ensuite, l'idée est :

    * Avec Ajax tu exécutes un code PHP.
    * Ce code PHP fait son processus et dans sa boucle "for ...", va p.ex. écrire dans un fichier texte un pourcentage. A chaque passage dans la boucle, tu mets à jour ton fichier pour, donc, faire progresser l'indicateur de 0 à 100.
    * Dans le même temps, tu as un second Ajax qui est exécuté à intervalle régulière (toutes les 5 secondes p.ex.) et qui lance une seconde requête php qui va juste lire le fameux fichier et faire un echo $content; suivie d'un die(). $content étant initialisé par un file_get_content(le_fichier).
    * Dans le success() de cette seconde requête Ajax, tu reçois donc une valeur numérique qui va te servir à initialiser la progress bar. Lorsque la valeur est supérieure ou égale à 100 (mieux vaut prévoir), tu désactives la récurrence de la seconde requête.

    Voilà, en gros, comment cela fonctionne.

    Désolé, je n'ai pas de tutos à te proposer.

    Bonne programmation.
    Christophe (cavo789)
    Mon blog, on y parle Docker, PHP, WSL, Markdown et plein d'autres choses : https://www.avonture.be
    Logiciel gratuit de scan antivirus : https://github.com/cavo789/aesecure_quickscan (plus de 45.000 virus détectés, 700.000 fichiers sur liste blanche)​

    Commentaire


    • #3
      Re : Afficher progression traitement

      oui, ca me semble bien compliqué et tordu comme solution.
      Mais merci d'avoir répondu
      Développement ERP Joomla 2.5

      Commentaire


      • #4
        Re : Afficher progression traitement

        Merci pour le "tordu" :-D

        Je n'ai rien trouvé d'autre et je ne vois pas non plus comment tu ferais autrement...

        Tu as un thread pour l'exécution de la tâche et un deuxième thread, récurrent, pour la lecture de l'avancement. Si tu vois une autre approche, n'hésite pas à venir la proposer ci-dessous.

        Bonne prog'
        Christophe (cavo789)
        Mon blog, on y parle Docker, PHP, WSL, Markdown et plein d'autres choses : https://www.avonture.be
        Logiciel gratuit de scan antivirus : https://github.com/cavo789/aesecure_quickscan (plus de 45.000 virus détectés, 700.000 fichiers sur liste blanche)​

        Commentaire


        • #5
          Re : Afficher progression traitement

          Bon voici ce que j'ai fait

          dans mon template de vue

          $statusfile=JURI::base()."loading.php";
          $document = JFactory::getDocument();
          $document->addScriptDeclaration('
          jQuery(document).ready(function() {
          var autoLoad=setInterval(
          function()
          {
          jQuery("#load_state").load("'.$statusfile.'").fade In("slow");
          }, 1000);
          });
          ');


          et bien sûr quelque part mettre le <div id="load_state"></div>

          et dans le loading.php que j'ai pour le moment mis en racine du site
          <?php

          define('_JEXEC', 1);

          if (file_exists(__DIR__ . '/defines.php'))
          {
          include_once __DIR__ . '/defines.php';
          }

          if (!defined('_JDEFINES'))
          {
          define('JPATH_BASE', __DIR__);
          require_once JPATH_BASE . '/includes/defines.php';
          }

          require_once JPATH_BASE . '/includes/framework.php';

          // Set profiler start time and memory usage and mark afterLoad in the profiler.
          JDEBUG ? $_PROFILER->setStart($startTime, $startMem)->mark('afterLoad') : null;

          // Instantiate the application.
          $app = JFactory::getApplication('site');

          // Execute the application.
          $app->initialise();
          $session = JFactory::getSession();
          $filename = $session->getId().".txt";
          echo file_get_contents($filename );


          et dans le model qui execute le traitement
          en début de traitrement
          $session = JFactory::getSession();
          $progress="";
          $filename = $session->getId().".txt";
          file_put_contents($filename,'');


          en cours de traitement (dans la boucle pour tester)
          $progress=$progress.".";
          sleep(1);
          file_put_contents($filename,"waiting ".$progress);

          et en fin de traitement
          file_put_contents($filename,'');

          Explications : ton idée de fichier texte, je pensais m'en passer, et utiliser directement la session et écrire dedans le texte qui affiche l'avancement.
          avec $session->set('loading_state', "text"); ) à la place de chaque file_put_contents
          Mais apparemment dans loading.php la session n'est pas actualisée et ca ne fonctionne pas.

          je suis obligé de créer un nom de fichier attaché à la session bien sûr, il me reste à trouver une solution un peu différente (peut etre avec mysql) pour éviter que les fichiers de sessions ".txt" ne se multiplient et soient détruits.
          Dernière édition par fgossart à 09/11/2016, 10h40
          Développement ERP Joomla 2.5

          Commentaire


          • #6
            Re : Afficher progression traitement

            Bonjour Fabrice

            Je rejoins en partie Cavo sur ses suggestions :
            1) oui AJAX est la bonne solution
            2) la progress bar Bootstrap "striped" est impeccable pour ce besoin (attention : J!3 = Bootstrap v2.3.2)


            Apres, hum... , avec un peu de gymnastique dans le MVC Joomla Admin, il est tout a fait faisable (pas si compliqué, ni tordu que cela ) d'introduire un enregistrement en 2 phases !

            J'ai appliqué cette solution pour un client qui avait besoin d'initialiser la BD avec une centaine d'enregistrements secondaires lors de la creation d'un nouvel enreg principal en admin.
            Processus :
            - clic sur le bouton [nouveau], j'affiche l'ecran Edit.php avec quelques champs primordiaux uniquement (titre, ...)
            - clic sur le bouton [enregistrer], le MVC de Joomla sauvegarde l'enregistrement normalement et redirect vers la view ... avec une modal qui lance le traitement secondaire en Ajax (car j'ai besoin de l'id de l'enreg principal), puis la page est rechargée en mode edition avec la totalité des champs de l'enreg principal.
            (voir les 2 captures ci-jointe)

            P.S. ma nécessité de passer par une modale AJAX avec temporisation des insert est du au fait que le serveur du client est un multualisé (!) ... et qu'il fallait éviter de se faire gronder par l'hébergeur

            Si cette solution correspond a ton besoin (?), je peux la detailler davantage
            Fichiers joints
            Garstud Workshop - Concepteur, Développeur et Formateur Joomla - http://www.garstud.com
            « Ce n’est pas parce que les choses sont difficiles que nous n’osons pas,
            c’est parce que nous n’osons pas qu’elles sont difficiles. »
            - Sénèque

            Commentaire


            • #7
              Re : Afficher progression traitement

              BOnjour Marc
              J'ai une solution qui fonctionne telle que je l'ai décrite et je l'ai améliorée hier pour stocker en BDD l'état d'avancement plutot que dans le fichier texte. Et également remplacé mes .... par une progress bar bootstrap.

              En quoi cette solution est-elle finalement mauvaise ?
              Car elle est très simple à mettre en oeuvre en fait, avec temporisation d'une seconde pour afficher la progressbar.
              progressbar que j'ai mis dans un module personnalisé.

              Ce qui est peut etre inutile c'est de lancer justement toutes les secondes cet appel alors qu'il n'y a rien à afficher ?

              Dans ce cas je suis preneur de ta solution, (il faut toujours continuer à apprendre), car je préfèrerai en effet avoir une modale

              Si tu veux me donner le code correspondant je suis prêt à l'étudier et l'adapter.
              Développement ERP Joomla 2.5

              Commentaire


              • #8
                Re : Afficher progression traitement

                Pour info, dans mon cas, interdiction d'utiliser la base de données, mon application devant être externe à Joomla et pouvant s'utiliser même sur des sites statiques. D'où le besoin d'utiliser un fichier pour stocker l'avancée. L'usage de $_SESSION était aussi impossible car, **de mémoire**, j'utilise des threads et dans ce cas, $_SESSION ne fonctionnait pas.
                Christophe (cavo789)
                Mon blog, on y parle Docker, PHP, WSL, Markdown et plein d'autres choses : https://www.avonture.be
                Logiciel gratuit de scan antivirus : https://github.com/cavo789/aesecure_quickscan (plus de 45.000 virus détectés, 700.000 fichiers sur liste blanche)​

                Commentaire


                • #9
                  Re : Afficher progression traitement

                  Bonsoir Fabrice,

                  Très bien je te prépare un ZIP d'exemple de sources ce WE.

                  Si ta solution marche, tant mieux !
                  Après c'est plus un aménagement du code pour rester dans l'esprit du MVC Joomla ... ce qui pourra a terme éviter quelques effets de bords et simplifier la maintenance.


                  En effet, ton loading.php à la racine du site n'est pas forcement judicieux (cela pourra complexifier la maintenance plus tard).
                  Et le rechargement du framework dans ce script peut être évité en utilisant le MVC classique.


                  Après, je n'ai pas le même soucis que toi sur le comptage de la progression, car pour mon besoin je sais exactement combien d'insert SQL je dois faire ! Donc, ton systeme de check de session toutes les secondes est bien, je pense.
                  Comme je l'ai dis précédemment, ma nécessité d'utiliser l'AJAX avec barre de progression est du au fait que je dois temporiser les insert par petits blocks avec des delais de pause entre 2 blocks afin de limiter la charge CPU !
                  Garstud Workshop - Concepteur, Développeur et Formateur Joomla - http://www.garstud.com
                  « Ce n’est pas parce que les choses sont difficiles que nous n’osons pas,
                  c’est parce que nous n’osons pas qu’elles sont difficiles. »
                  - Sénèque

                  Commentaire


                  • #10
                    Re : Afficher progression traitement

                    Oui le loading.php sera déplacé bien entendu et remplacé par un appel au controleur classique.
                    Par contre tu écris que le rechargfement du framework peut etre évité ? je ne vois pas trop comment car le loading.php a besoin désormais d'accéder à un Helper que j'ai écrit qui renvoie le pourcentage d'avancement.
                    Ce Helper fait appel à la session pour ouvrir un enregistrement correspondant de BDD qui lui, contient le pourcentage.
                    Donc meme si je remplace loading.php par un controller dans mon composant, ca ne changera pas grand chose au niveau rechargement ?

                    Je vais voir ton code et l'adapterai a mon cas surement, et cela me fera un bon rappel pour Ajax
                    Développement ERP Joomla 2.5

                    Commentaire


                    • #11
                      Re : Afficher progression traitement

                      Envoyé par garstud Voir le message
                      Bonsoir Fabrice,

                      Très bien je te prépare un ZIP d'exemple de sources ce WE.

                      ...
                      Salut Marc.

                      Content de te lire à nouveau.

                      Je suis aussi intéressé par ton idée de script.


                      @ bientôt aux prochains JDay peut-être ?.
                      A tous les utilisateurs de Joomla du très Grand Est de la France et du Jura suisse
                      Rejoignez le Joomla Users Groupe Alsace...
                      roland_d_alsace va-t-il devenir roland_du_grand_est ?

                      Commentaire


                      • #12
                        Re : Afficher progression traitement

                        pourquoi ne pas prendre exemple sur ce qui existe déja, à savoir la barre de progression affichant le gif joomla avec un voile sur la page lors de l'installation de Joomla?

                        Dans le fichier /libraries/joomla/forms/fields/meter.php, tu as des appels comme ceux ci dessous:

                        Code:
                        		$data = '';
                        		$data .= ' data-max="' . $this->max . '"';
                        		$data .= ' data-min="' . $this->min . '"';
                        		$data .= ' data-step="' . $this->step . '"';
                        une piste pour toi?
                        Dernière édition par lefabdu51 à 15/11/2016, 11h56

                        Commentaire


                        • #13
                          Re : Afficher progression traitement

                          Envoyé par lefabdu51 Voir le message
                          pourquoi ne pas prendre exemple sur ce qui existe déja, à savoir la barre de progression affichant le gif joomla avec un voile sur la page lors de l'installation de Joomla?
                          Si c'est ce à quoi je pense (attente lors des install par exemple), ce n'est pas une barre de progression.

                          Une simple image animées, histoire d'occuper l'écran.

                          Pas d'Ajax, donc pas d’échange avec le serveur, pas d'information réelle sur la progression.

                          ...et donc si le serveur ne rafraichi pas la page dans le set_time_limit defini dans le php.ini, bye bye le script en cours ...
                          Dernière édition par roland_d_alsace à 15/11/2016, 11h46
                          A tous les utilisateurs de Joomla du très Grand Est de la France et du Jura suisse
                          Rejoignez le Joomla Users Groupe Alsace...
                          roland_d_alsace va-t-il devenir roland_du_grand_est ?

                          Commentaire


                          • #14
                            Re : Afficher progression traitement

                            @roland d alsace :
                            ok....
                            et une barre semblable a la barre d'installation de la base de données ?
                            Ce ne serait pas ce qu il souhaite mettre en place?

                            Commentaire


                            • #15
                              Re : Afficher progression traitement

                              Effectivement mettre un gif animé ne me sert à rien.
                              Mais j'ai déjà réalisé ce que j'ai demandé et expliqué.

                              Je viens de l'améliorer aussi
                              Code PHP:
                              $statusfile=JURI::base()."loading.php";/* reste à modifier l'emplacement pour ne plus le mettre à la racine du site*/
                              $document JFactory::getDocument();
                              $document->addScriptDeclaration('
                               var AjaxProgress=function()
                               {
                                   jQuery("#load_state").load("'
                              .$statusfile.'").fadeIn("slow");
                                   
                               }
                               jQuery(document).ready(function() {

                                  AjaxProgress();
                               });     
                              '
                              );

                              $document->addScriptDeclaration('
                                  Joomla.submitbutton = function(task)
                                  {
                                      if (task == "tache qui doit lancer le traitement")
                                      {
                                          setInterval(AjaxProgress,1000);
                                      }
                                      Joomla.submitform(task, document.getElementById("item-form"));
                                      
                                  };
                              '
                              ); 
                              Ainsi contrairement à la premiere version le processus ajax n'est pas appelé inutilement tant que je n'ai pas cliqué sur le bouton qui va lancer le traitement ce qui va diminuer la charge du serveur.
                              Développement ERP Joomla 2.5

                              Commentaire

                              Annonce

                              Réduire
                              Aucune annonce pour le moment.

                              Partenaire de l'association

                              Réduire

                              Hébergeur Web PlanetHoster
                              Travaille ...
                              X