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
Lorsque l'utilisateur clique sur un bouton :
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.
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 ;-)
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