Foros del Web » Programando para Internet » PHP »

Barra de porcentaje

Estas en el tema de Barra de porcentaje en el foro de PHP en Foros del Web. Hola a todos. He realizado un script para poder mostrar una barra de porcentaje de registros procesados para que no se quede la pantalla en ...
  #1 (permalink)  
Antiguo 22/11/2006, 04:04
Avatar de manuweb  
Fecha de Ingreso: julio-2002
Mensajes: 75
Antigüedad: 21 años, 9 meses
Puntos: 10
Barra de porcentaje

Hola a todos.

He realizado un script para poder mostrar una barra de porcentaje de registros procesados para que no se quede la pantalla en blanco mientras se ejecuta el codigo PHP y os la pongo para quien pueda interesarle:

Código PHP:
<?
// inicializar la barra
//
// $registros = nº de registros a procesar
// $texto = texto a mostrar (p.e. nombre del campo a mostrar)
// imagen/trans.gif es un gif transparente, aunque no es necesario.
//
function inicializa_barra($registros,$texto) {

    
?>
        <TABLE width='400'>
        <TR>
            <TD width='30' align="left" style='font-size:14px;'><? echo $texto;?></TD>
            <TD width='370' align="left" style='font-size:14px;'><B><div id='texto' style='position:relative;color: #c21602;'></div></B></TD>
        </TR>
        <TR>
            <TD colspan=2 align="center"><br><br>
            <TABLE  cellspacing="1" cellpadding="1" width='302' bgcolor="#c21602">
            <TR>
                <TD bgcolor="#ffffff" align="left" style='font-size:14px;' VALIGN="middle"><div id='progreso' style='position:relative;overflow:hidden'><div id='porcentaje' style='position:absolute;left:130;'>0 %</div><IMG SRC="imagen/trans.gif" WIDTH="1" HEIGHT="15" BORDER=0 ALT=""></div></TD>
            </TR>
            </TABLE>
        </TD>
        </TR>
        </TABLE>

    <?
    
return round($registros/100);
}
// procesamiento de la barra
//
// $porcentaje: porcentaje a mostrar
// $pixeles: tamaño de la barra
// $texto: campo a mostrar o texto (p.e. nombre del registro procesado)
// imagen/separacion.gif es el gif de la barra (un gif de 1 x 1 con el color desedao)
//
function procesa_barra($porcentaje,$pixeles,$texto) {
        
?>
        <SCRIPT LANGUAGE="JavaScript">
        <!--
        document.getElementById('texto').innerHTML="<? echo $texto;?>";
        document.getElementById('progreso').innerHTML="<div id='porcentaje' style='position:absolute;left:130;'><B><? echo $porcentaje.' %';?></B></div><IMG SRC='imagen/separacion.gif' WIDTH='<? echo $pixeles;?>'  HEIGHT='15' BORDER=0>";
        //-->
        </SCRIPT>
        <?
}
// terminación de la barra
//
// (no necesario si el script que usa esto redirecciona a otra página)
// $texto: texto que se muestra (p.e. T E R M I N A D O)
//
function termina_barra($texto) {
    
?>
    <SCRIPT LANGUAGE="JavaScript">
        <!--
        document.getElementById('texto').innerHTML="<? echo $texto;?>";
        //-->
    </SCRIPT>
    <?
}
?>
Todo esto lo guardo en un fichero php para poder usarlo con include.

Y lo uso de la siguiente forma:

Código PHP:
<?
    
include "include/barra_porcentaje.php";
    
$sql"SELECT * from clientes";
    
$res=mysql_query($sql); 
    
$numeroRegistros=mysql_num_rows($res); 
    
// o bien count($array)
    
$procesados=0;
    
$porcentaje=0;
    
$tope inicializa_barra($numeroRegistros,"");
    
$cont=0;
    while (
$row=mysql_fetch_array($res)) {
        if (
$cont $tope) {
            
$cont=0;
        }
        
$procesados++;
        
$pixelesround(($procesados*300)/$numeroRegistros);
        
$porcentajeround(($procesados*100)/$numeroRegistros);

        
//
        // aqui las operaciones que se deseen
        //

        
if ($cont==0) {
            
procesa_barra($porcentaje,$pixeles,"Espere . . .");
            
flush();
            
ob_flush();
        }
        
$cont ++;
    }
    
termina_barra($texto);
?>
Me va muy bien, para restaurar archivos sql, procesar tablas con muchos registros, etc. y que la pantalla no quede vacia.

Saludos,

manuweb
  #2 (permalink)  
Antiguo 22/11/2006, 05:26
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
Podrías explicar un poco el código que usas .. ya que hay una parte bien importante de javascript y otra de PHP sobre el manejo del buffer de salida de PHP. Así nos sirve el ejemplo y aprendemos un poco más sobre el "buffer" de salida de PHP y como gestionarlo para un ejemplo práctico como el que propones.

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
  #3 (permalink)  
Antiguo 22/11/2006, 07:22
Avatar de manuweb  
Fecha de Ingreso: julio-2002
Mensajes: 75
Antigüedad: 21 años, 9 meses
Puntos: 10
A ver,


La barra la he colocado en un <TABLE> que se crea con la función inicializa_barra().

Ahí tengo tres <DIV>, el 1º es el que mostrará un texto o el registro procesado, el 2º es el marco de la barra que contiene el 3º que es la barra.

la segunda función, procesa barra(), utiliza javascript para cambiar el contenido de las etiquetas <DIV> que muestran la barra utilizando para ello document.getElementById('id').innerHTML que altera el HTML.

La tercera función, termina_barra(), simplemente sirve para indicar al que ve la página que se ha terminado.

dentro del php que recorrería una tabla o un fichero se llama a las funciones mencionadas:


Código PHP:
<? 
   
// ejemplo para recorrer una tabla de clientes y actualizar un campo
    
include "include/barra_porcentaje.php"
    
$sql"SELECT * from clientes"
    
$res=mysql_query($sql);  
    
$numeroRegistros=mysql_num_rows($res);  

    
// para el calculo de datos prcesados
    
$procesados=0
    
$porcentaje=0
    
// tope es para determinar cuando debo actualizar la barra
    
$tope inicializa_barra($numeroRegistros,"Cliente:"); 
    
$cont=0
    
$texto="T E R M I N A D O";
    
// recorro la tabla
    
while ($row=mysql_fetch_array($res)) { 
        if (
$cont $tope) { 
            
$cont=0
        } 
        
$procesados++; 
        
$pixelesround(($procesados*300)/$numeroRegistros); 
        
$porcentajeround(($procesados*100)/$numeroRegistros); 

        
// 
        // aqui las operaciones que se deseen en la tabla 
        // 

        // compruebo que hay que añadir una barrita
        
if ($cont==0) { 
            
procesa_barra($porcentaje,$pixeles,$row['nombre']);
            
flush(); 
            
ob_flush(); 
        } 
        
$cont ++; 
    } 
    
termina_barra($texto); 
?>

No sé, quizas está farragoso pero os aseguro que queda bien.

Solo me queda algo para los envios de archivo de descarga, generar PDF, es decir, los que llevan HEADER y ya son algo más complicado. En esto estoy bloquedo.

Saludos
  #4 (permalink)  
Antiguo 22/11/2006, 07:30
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
Bueno .. gracias por la explicación .. pero igual para completar el tema te faltó hablar sobre el control del buffer de PHP que haces y que sin eso no sería posible que PHP enviase el "proceso" en curso que va realizando como salida al cliente (navegador) .. Pero bueno, no pasa nada ..

Cita:
Solo me queda algo para los envios de archivo de descarga, generar PDF, es decir, los que llevan HEADER y ya son algo más complicado. En esto estoy bloquedo.
Con PHP no podrás controlar ese tema. Las cabeceras HTTP se envian antes que el HTML/Javascript que puedas quere enviar tu .. y tampoco puedes ejecutar procesos "paralelos" para por un lado ir descargando el archivo y por otro ir viendo lo que lleva descargardo .. ahí tendrías que manejar datos en forma "RAW" (esto lo maneja mejor otros lenguajes como Perl según tengo entendido).

De todas formas si llegas consigues algo .. compartelo.

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 11:38.