Welcome to a New Age, welcome to the Lexp Age !    —  Gero

Discussions

IDE PHP ?

Fabe 607 Geek
Reprise automatique du message précédent.
Sans réinventer la roue :

* Zend Framework Progress Bar
* La dépendance Composer, sur packagist
pom 145 Padawan
En réinventant la roue ;) mais avec les nouvelles techno, je me suis inspiré de [url=http://eloquentjavascript.net/14_event.html]ça
[/url] partie Script execution timeline qui utilise les web workers. Un web worker se lance dans un thread séparé et parle avec son client par le biais de message (postMessage) et le système d'évènement (addEventListener).

J'ai fait un bout de code qui marche (sous FF) :

index.html
<meta charset="UTF-8"  />
<script src="lib/jquery.js"></script>

<h1>Avancement Traitement</h1>
<h2 style=color:red><span id="avancement"></span> %</h2>

<script>
var worker = new Worker("worker.js");

worker.addEventListener("message", function(event) {
console.log("CLIENT : ", event.data);
$("#avancement").text(event.data["avancement"]);
});

// on lance l'appel au traitement backoffice
worker.postMessage({action : "run"});
</script>
worker.js
addEventListener("message", function(event) {
if (event.data["action"] === "run") {
// lancer traitement
console.log("WORKER : traitement en cours...");
traitement();
}
else {
console.log("WORKER : demande inconnue");
}
});

// simulation d'un traitement lourd
var NB_BOUCLES_MAX = 17;
var nbBoucles = 0;
var traitement = function traitement() {

postMessage({avancement : Math.ceil(nbBoucles / NB_BOUCLES_MAX * 100)});
if (nbBoucles == NB_BOUCLES_MAX ) {
console.log("WORKER : Fin du traitement lourd");
return;
}
console.log("WORKER : simulation de traitement : " + nbBoucles);
nbBoucles++;
setTimeout("traitement()", 1000);
};
Sous Chrome, ça rend une erreur de sécurité Cross domain, ce qui devrait être réglé en l'hébergeant sur un serveur web.
PetitCalgon 2660 Bob
Alors finalement ma solution ressemble à ça :
    var file_data = $("#input_file").prop("files")[0];
var form_data = new FormData();
form_data.append("import_file", file_data);
form_data.append("ajax", "true");
form_data.append("import", "1");
$.ajax({
url: "import.php",
cache: false,
contentType: false,
processData: false,
data: form_data, // Setting the data attribute of ajax with file_data
type: 'post',
success: function (data) {
var splited = data.split('|');
$('#state_import_' + splited[0]).html(splited[1] + ' lignes importées');
}
});
A priori, ça ne fonctionne pas avec IE < 10, mais bon, vu que c'est du hyper spécifique pour 2-3 utilisateurs, je peux leur demander de pas me faire chier et utiliser du FFx ou du Chrome ou du IE >= 10

Edit: je n'ai pas d'indicateur d'avancement, juste un GIF qui tourne pour dire que c'est en cours, et au succès de l'import, le GIF qui tourne remplacé par le texte "x lignes importées". Ça me permet au moins de séparer l'import en plusieurs étapes parce que ça prenait une plombe ;-)


Ce message a été modifié 2 fois. Dernière modification : 20 novembre 2014 à 21:11 par PetitCalgon.

Guybrush 8344 Bob
C'est quoi le souci avec IE < 10 en fait ? Il supporte pas JQuery ? :confused:
PetitCalgon 2660 Bob
Non c'est FormData qui est supporté à partir de IE 10
PetitCalgon 2660 Bob
Bon alors, j'ai un petit soucis que je n'arrive pas à résoudre.
Le code que j'ai posté là-haut est lancé 7 fois à la suite avec à chaque fois des ID différents :
GENERAL
MEMBRES
OPERATIONS
PARAMETRES
AERONEFS
INSTRUCTEUR
TYPE_OPERATION
Je vois du côté de la page PHP qu'elle est bien appelée 7 fois avec les les 7 cités, elles écrivent aussi toutes chacune un log de passage, et j'ai bien 7 logs qui sont écrits.
Pourtant quand le retour se fait côté JS, il arrive qu'un des <span id="state_import_ID"> ne soit pas remplacé par le résultat récupéré, pourquoi ?
Parce que ça va éventuellement trop rapidement ?
Parce que je fais une erreur de traitement quelque part ?
Parce que c'est hasardeux de faire ce genre de choses et qu'il y a fort à parier qu'un des retours va être perdu ou que le asynchrone va surcharger ?
Thx
Fabe 607 Geek
Utilises la console javascript et/ou le debugger, t'auras tout de suite l'info.
Tu peux poser un breakpoint programmatiquement avec l'instruction debugger;


Ce message a été modifié 1 fois. Dernière modification : 23 novembre 2014 à 20:13 par Fabe.

PetitCalgon 2660 Bob
Merci Fabe, finalement, j'avais bien un problème côté PHP, je faisais un return $zdb->execute($delete); en pensant que ça me retournait le nombre d'enregistrements supprimées, alors que c'était un objet, et ça devait me péter une exception silencieusement quelque part ...
Ajouté un petit
$result = $zdb->execute($delete);
return $result->count();
et voila.
Les objets c'est mal quand on sait pas ce qui revient, et le gettype($result) te donne une super info : "object", ouééééé !!! Mais quoi comme objet ?

Répondre

Vous devez être inscrit et identifié.