Mindig érdekelt, hogyan lehet szerver oldalon futtatott kóddal kliens oldalon progressbart készíteni? A probléma az, hogy a szerver oldal csak lineárisan tudja kiírni a kliensnek a PHP kimenetet, viszont a kliens oldalon szeretnénk a progressbart egy helyben látni.
A megoldás azon az ötleten alapul, hogyha egy div-nek a helyét a böngészőben abszolúttá teszem és újra meg újra kiíírom a div-et a kliensnek, ugyanazzal az ID-val, akkor ugyanoda fog kikerülni.
A megoldandó problémák a következők:
- A régi tartalom tűnjön el és kerüljön oda az új.
- Lehetőleg az új tartalom írja felül a régit
Folyamatosan menjen és csak akkor írjon ki tartalmat, ha muszály.
Egy jquery-vel megtámogatott megoldást írtam, de valójában egy kis css és egy kis PHP kódról van szó. Szükség van egy jquery csomagra és négy db gif fájlra. A képfájlok innen szedhetők elő, és itt lehet megnézni a működésüket. http://t.wits.sg/misc/jQueryProgressBar/demo.php
Az eredeti kódok tisztán jqueryvel működtek és nem voltak képesek a progressbart működtetni, mivel a jquery kliens oldali és a php szerver oldali.
A kód használata roppant egyszerű:
<script type="text/javascript" src="js/jquery.js"></script>
<?php
$max = 10000;
$pr = new progressbar('foo',$max);
for($i=0;$i< $max ; ++$i ) {
$pr->setValue($i);
}
$pr->setValue($i);
$pr->disable();
?>
Ezt az osztályt kell betenni egy include fájlba vagy az oldalra.
/**
* Progressbar PHP-ból létrehozva
*
*/
class progressbar {
private $max;
private $id;
private $value;
private $enabled;
private $pold = -1;
function __construct($id,$max,$width=120,$value = 0){
$this->id = $id;
$this->max = $max;
$this->value = $value;
$this->enabled = true;
$this->width = $width;
$this->styles();
}
function styles(){
print"
<style type='text/css'>
.progressbar{
position:absolute;
top:300px;
background-color:".SETTXTBGCOLOR.";
left: 50%;
width:".($this->width+40)."px;
margin-left:-60px;
padding-top:5px;
height: 20px;
text-align:center;
vertical-align: middle;
}
.progressimage{
width:'.$this->width.'px;
height: 12px;
padding: 0pt;
margin:0pt;
vertical-align: middle;
}
.progresstext{
vertical-align: middle;
}
</style>";
}
function write(){
$percent = (int) ((100*$this->value) / $this->max);
if($percent > $this->pold){
$style='z-index:'.$percent.';';
if(!$this->enabled){
$style='display:none;';
}
$out = '<div id="progress'.$this->id.$percent.'" class="progressbar" style="'.$style.'">';
$out .= '<img id="pr_percimage" class="progressimage" width="'.$this->width.'" src="js/progressbar/images/progressbar.gif"';
$out .= 'style="';
if($percent>80){
$out .="background-image:url('js/progressbar/images/progressbg_green.gif'); ";
}elseif($percent>40){
$out .="background-image:url('js/progressbar/images/progressbg_yellow.gif'); ";
}elseif($percent>40){
$out .="background-image:url('js/progressbar/images/progressbg_orange.gif'); ";
}elseif($percent>20){
$out .="background-image:url('js/progressbar/images/progressbg_red.gif'); ";
}else{
$out .="background-image:url('js/progressbar/images/progressbg_black.gif'); ";
}
$out .= ';background-position:'.(-120+(int)(($percent*$this->width)/100 )).'px 50%;" title=" '.$percent.'%">';
$out .='<span id="pr_perctext" class="progresstext">'.$percent.'% </span></div>';
$out .='<script>$("div#progress'.$this->id.$this->pold.'").css("display","none");</script>';
print $out;
flush();
$this->pold = $percent;
}
}
function setValue($value=0){
$this->value = $value;
$this->write();
}
function enable(){
$this->enable=true;
$this->write();
}
function disable(){
$this->enable=false;
$this->write();
}
}