Bonjour,

Après plusieurs jours de recherche et de test, je me décide à poster cette demande de renseignement en dernier recours :-)

Ce que je cherche à faire est tout simple mais malgrés tous les essais que j'ai pu faire ... je n'y arrive pas :-(

Avec le Framework symfony v2.8, j'aimerais animer une progress bar bootstrap pendant l'exécution d'une action d'un controller et ce lorsque l'utilisateur clique sur un bouton.

Le principe que j'utilise est

  • la mise à jour d'une variable de SESSION pendant l'exécution d'une action de traitement
  • la lecture de cette variable de SESSION par une autre action

Lorsque l'utilisateur clique sur un bouton :

  • via AJAX j'exécute mon action de traitement
  • via AJAX j'exécute mon action de lecture de la variable de SESSION tant que mon action de traitment n'est pas terminée.

En somme, rien de bien compliqué :-)

Le problème auquel je suis confronté est que mon action de lecture de la variable de SESSION ne s'exécute pas pendant l'exécution de mon action de traitement. Avant mon action de

traitement oui, après oui, mais pendant ... non !

--> Il m'est impossible de lire la variable de SESSION pendant le traitement et donc impossible d'animer la progress bar.

Voici le code JS :

$('#generator').click(function() {

    var isInProgress = false;

    traitement();

    function traitement()
    {
        isInProgress = true;
        checkProgress();
        $.ajax({
                type: "GET",
                url: '{{ path('sws_back_createplanning', { 'idChampionnat': Championnat.id })}}',
                async : true,
                cache: false,
                dataType:'html',
                success: function(data){},
                error: function(){  },
                complete: function(){
                    isInProgress = false;
                }
        });

    }  

    function checkProgress()
    {
        if( isInProgress != false )
        {
            $.ajax({
                type: "GET",
                url: 'championnat/getprogress/',
                async : true,
                cache: false,
                dataType:'html',
                success: function(data){

                     /* animation de la progress bar */

                 },
                error: function(){  },
                complete: function(){
                    checkProgress();
                }
            });
        } else { }
    }
})

Voici le code de l'action de traitement :

public function traitementAction($id){

    $session = new Session();
    $session->set('progress', 0);

    // traitement #1

    $session->set('progress', 25);

    // traitement #2

    $session->set('progress', 50);

    // traitement #3

    $session->set('progress', 75);

    // traitement #4

    $session->set('progress', 100); 

    return new Response ("Traitement terminé");

}

Voici le code de l'action de lecture de la variable de SESSION :

public function getProgressAction(Request $request)
{

    $percent = $this->get('session')->get('progress');

    if ($percent == 100){
        $session = new Session();
        $session->remove('progress');        
    }

    return new Response($percent);  
}

Dans mes essais, j'ai également converti mon action en "command" et exécuté cette "command" avec le composant Process.

  • avec la méthode RUN(), le même comportement qu'avec mon action de controller est constaté
  • avec la méthode START() (exécution asynchrone), l'exécution de la "command" est arrêtée dés la fin de l'action du controller qui exécute la "command" --> dû à la notion de process

parent/enfant. Cela veut dire, si j'ai bien compris, que dés que le process parent (exécution de l'action du controller) se termine, cela mais fin au process enfant qui a démarrer la

"COMMAND" --> un process enfant ne survit pas à son process parent.

Voici le code de l'action de controller qui démarre la "COMMAND":

public function commandAction($id)
{
    $commandline = "php console app:generate-planning ".$id;
    $process = new Process($commandline);
    $dossier = $this->get('kernel')->getRootDir() . DIRECTORY_SEPARATOR;
    $process->setWorkingDirectory($dossier);

    $process->start();   // https://github.com/symfony/symfony/issues/20513
    $process->wait();    // Pour ne pas que l'exécution de la commande ne soit 'Killée' ... mais empêche la lecture de la variable de SESSION tant que la commande n'est pas terminée

    return new Response ("Commande démarrée");
}

Donc pour résumé mon problème, je n'arrive pas a exécuter mes deux requêtes en même temps. Je dois certaiement passer à côté de quelque chose ... pouvez-vous m'aider ?

Merci d'avance ;-)

1 réponse


benbet
Auteur

Problème résolu ... le problème se situait au niveau de la gestion des sessions (close session).

--> https://openclassrooms.com/forum/sujet/plusieurs-requetes-ajax-en-meme-temps