Zend_ProgressBar
est un composant pour créer et mettre à
jour les barres de progression dans différents environnements. Il consiste en un backend
unique, qui affiche la progression au travers de l'un des multiples adaptateurs. A
chaque mise à jour, il prend un chemin absolu et un message d'état, et appelle ensuite
l'adaptateur avec certaines valeurs précalculées comme le pourcentage et le temps
restant estimé.
Zend_ProgressBar
est assez simple d'utilisation. Vous créez
simplement une nouvelle instance de Zend_Progressbar
, en
définissant des valeurs minimum et maximum, et en choisissant un adaptateur pour
afficher les données. Si vous voulez travailler avec un fichier, vous pouvez faire comme
ceci :
$progressBar = new Zend_ProgressBar(0, $fileSize, $adapter); while (!feof($fp)) { // Faire quelque chose $progressBar->update($currentByteCount); } $progressBar->finish();
Dans un premier temps, une instance de Zend_ProgressBar
,
avec une valeur minimum de 0, une valeur maximum correspondant à la taille totale du
fichier et un adaptateur spécifique. Ensuite on travaille avec le fichier et à chaque
boucle la barre de progression est mise à jour avec le nombre d'octets courant. A la fin
de la boucle, le statut de la barre de progression est réglé à terminé.
Zend_ProgressBar
possède aussi une méthode
refresh()
qui recalcule le temps restant estimé et met à jour l'adaptateur.
Ceci est pratique quand il n'y a aucune donnée à mettre à jour mais que vous souhaitez
que la barre de progression soit mise à jour.
Zend_ProgressBar
est fourni avec les deux adaptateurs
suivants :
Zend_ProgressBar_Adapter_Console
est un adaptateur de type
texte pour les terminaux. Il peut automatiquement détecter la largeur du terminal mais
supporte aussi des largeurs personnalisées. Vous pouvez définir quels éléments seront
affichés avec la barre de progression et personnaliser leur ordre. Vous pouvez aussi définir
le style de la barre de progression elle-même.
Reconnaissance automatique de la largeur de la console
shell_exec
est nécessaire pour que ceci fonctionne sur les systèmes
de type *nix. Sur Windows, il y a toujours un terminal fixe de 80 caractères de large,
donc la reconnaissance automatique n'est pas nécessaire.
Vous pouvez paramétrer les options de l'adaptateur soit via les méthodes
set*
soit en fournissant un tableau ("array") ou une instance
Zend_Config
en tant que premier paramètre du constructeur. Les
options disponibles sont :
-
outputStream
: un flux de sortie différent, si vous ne souhaitez pas utiliser STDOUT. Peut être n'importe quel autre flux comephp://stderr
ou un chemin vers un fichier. -
width
: soit un entier ou la constanteAUTO
deZend_Console_ProgressBar
. -
elements
: soitNULL
par défaut ou un tableau avec au moins l'une des constantes deZend_Console_ProgressBar
suivantes comme valeur :-
ELEMENT_PERCENT
: la valeur courante en pourcentage. -
ELEMENT_BAR
: la barre qui va représenter le pourcentage. -
ELEMENT_ETA
: le calcul automatique du temps restant estimé (NDT. : "Estimated Time for Accomplishment"). Cet élément est affiché pour la première fois qu'après cinq secondes, car durant ce temps, il n'est pas possible de calculer des résultats précis. -
ELEMENT_TEXT
: un message de statut optionnel concernant le processus courant.
-
-
textWidth
: largeur en caractères de l'élémentELEMENT_TEXT
. Par défaut vaut 20. -
charset
: encodage de l'élémentELEMENT_TEXT
. Par défaut vaut "utf-8". -
barLeftChar
: un caractère qui est utilisé du côté gauche de l'indicateur de la barre de progression. -
barRightChar
: un caractère qui est utilisé du côté droit de l'indicateur de la barre de progression. -
barIndicatorChar
: un caractère qui est utilisé pour l'indicateur de la barre de progression. Celui-ci peut être vide.
Zend_ProgressBar_Adapter_JsPush
est un adaptateur qui vous
permet de mettre à jour une barre de progression dans un navigateur au travers de
Javascript. Ceci veut dire qu'une seconde connexion n'est pas nécessaire pour recueillir le
statut du processus courant, mais que le processus lui-même envoie son statut directement au
navigateur.
Vous pouvez paramétrer les options de l'adaptateur soit avec les méthodes
set*
soit en fournissant un tableau ("array") ou une instance de
Zend_Config
contenant les options en tant que premier paramètre du
constructeur. Les options disponibles sont :
-
updateMethodName
: la méthode Javascript qui sera appelée à chaque mise à jour. La valeur par défaut estZend_ProgressBar_Update
. -
finishMethodName
: la méthode Javascript qui sera appelée lorsque le statut terminé sera atteint. La valeur par défaut estNULL
, qui veut dire que rien n'est fait.
L'utilisation de cet adaptateur est assez simple. Premièrement vous créez une barre de
progression pour le navigateur, soit avec Javascript ou auparavant en pur HTML. Ensuite vous
définissez une méthode de mise à jour et optionnellement une méthode de finalisation en
Javascript, les deux acceptant un objet JSON en tant qu'unique argument. Ensuite vous
appelez une page Web avec un processus chronophage dans une balise iframe
ou
object
masqué. Pendant que le processus tourne, l'adaptateur appelle la méthode
de mise à jour à chaque mise à jour avec un objet JSON, contenant le paramètres suivants
:
-
current
: la valeur courante -
max
: la valeur maximum -
percent
: le pourcentage calculé -
timeTaken
: le temps depuis quand le processus courant est en marche -
timeRemaining
: le temps estimé pour que le processus se termine -
text
: le message de statut optionnel, si fourni
Exemple 653. Exemple basique du fonctionnement côté-client
Cet exemple illustre un paramétrage basique du HTML, CSS et JavaScript pour l'adaptateur JsPush :
<div id="zend-progressbar-container"> <div id="zend-progressbar-done"></div> </div> <iframe src="long-running-process.php" id="long-running-process"></iframe>
#long-running-process { position: absolute; left: -100px; top: -100px; width: 1px; height: 1px; } #zend-progressbar-container { width: 100px; height: 30px; border: 1px solid #000000; background-color: #ffffff; } #zend-progressbar-done { width: 0; height: 30px; background-color: #000000; }
function Zend_ProgressBar_Update(data) { document.getElementById('zend-progressbar-done').style.width = data.percent + '%'; }
Ceci créera un simple conteneur avec une bordure noire et un bloc qui indique le
niveau du processus courant. Vous ne devez pas masquer l'iframe
ou
l'object
par display: none;
, car dans ce cas les navigateurs
comme Safari 2 ne chargeront pas le contenu réel.
Plutôt que de créer votre barre de progression personnalisée, vous pouvez utiliser une de celles disponibles dans les librairies JavaScript comme Dojo, jQuery etc. Par exemple, il existe :
Intervalle de mise à jour
Vous devez faire attention à ne pas envoyer trop de mises à jour, puisque chaque mise à jour a une taille minimum de 1ko. Ceci est requis par le navigateur Safari pour rendre et exécuter l'appel de fonction. Internet Explorer possède une limitation similaire mais à 256 octets.
Zend_ProgressBar_Adapter_JsPull
est l'opposé de jsPush, car il
requiert de venir récupérer les nouvelles mises à jour, plutôt que d'envoyer les mises à
jour vers le navigateur. Généralement, vous devriez utiliser l'adaptateur avec l'option de
persistance de Zend_ProgressBar
. Lors de l'appel, l'adaptateur envoie
une chaîne JSON vers le navigateur, qui est comparable à la chaîne JSON envoyée par
l'adaptateur jsPush. La seule différence est qu'il contient un paramètre supplémentaire
finished, qui vaut FALSE
quand update()
est appelée
ou TRUE
quand finish()
est appelée.
Vous pouvez paramétrer les options de l'adaptateur soit avec les méthodes
set*()
soit en fournissant un tableau ("array") ou une instance de
Zend_Config
contenant les options en tant que premier paramètre du
constructeur. Les options disponibles sont :
-
exitAfterSend : sort de la requête courante après que les données aient été envoyées au navigateur. Vaut
TRUE
par défaut.