Ver Mensaje Individual
  #2 (permalink)  
Antiguo 07/02/2009, 19:21
TiempoMuerto
 
Fecha de Ingreso: junio-2007
Mensajes: 70
Antigüedad: 16 años, 11 meses
Puntos: 2
Respuesta: [Aporte] Trabajando con el contenido de directorios (WCD v0.1)

- Clase Ejecutor, que implementa las acciones, llamadas ejecutores, a realizar sobre los elementos del directorio que pasen el filtro deseado.

Código PHP:


<?php

    
/* Clase que implementa el uso de ejecutores que ejecutarán una cierta función sobre los elementos
    *    que pasan el filtro.
    *    
    *    Desarrollada por: José Raúl Ruiz Sarmiento.    Versión: 0.1
    *    
    *    Esta clase es de libre utilización y modificación para cualquier proposito, siempre y cuando no se
    *    elimine este texto. De ninguna manera se asegura el correcto funcionamiento de esta clase.
    *
    *    Cualquier aportación o detección de errores puede notificarse a: [email protected]        
    */
    
    
class Ejecutor{
    
        
/* Atributos de la clase */
        
        
private $ruta;
        private 
$nombre_ejecutor;
        private 
$params;
        private 
$params_aux;
        
        
/* Constructor de la clase*/ 
        
        
function __construct($ruta,$nombre_ejecutor,$params=null,$params_aux=null){
            
$this->ruta $ruta;
            
$this->nombre_ejecutor $nombre_ejecutor;
            
$this->params $params;
            
$this->params_aux $params_aux;
        }
        
        
/* Métodos para consultar y editar atributos privados de la clase */
        
        
public function set_ruta($ruta){
            
$this->ruta $ruta;
        }
        
        public function 
get_ruta(){
            return 
$this->ruta;
        }
        
        public function 
set_nombre_ejecutor($nombre_ejecutor){
            
$this->nombre_ejecutor $nombre_ejecutor;
        }
        
        public function 
get_nombre_ejecutor(){
            return 
$this->nombre_ejecutor;
        }
        
        public function 
set_params($params){
            
$this->params $params;
        }
        
        public function 
get_params(){
            return 
$this->params;
        }
        
        public function 
set_params_aux($params_aux){
            
$this->params_aux $params_aux;
        }
        
        public function 
get_params_aux(){
            return 
$this->params_aux;
        }
        
        
/* Ejecutar ejecuta el ejecutor contenido en $nombre_ejecutor sobre el elemento pasado como argumento.
            Para su correcto funcionamiento el nombre del ejecutor ha de ser correcto */
        
        
public function ejecutar($elemento){
            
$nombre $this->nombre_ejecutor;    
            
$this->$nombre($elemento);
        }
        
        
/* Ejecutor que muestra por pantalla el elemento pasado como argumento */
        
        
private function ejecutor_mostrar($elemento){
            echo 
$elemento."<br />";
        }
        
        
/* Ejecutor que guarda en el array $params_aux el argumento $elemento en una posición correcta.
            Posteriormente se podrá recuperar este array con el método público get_params_aux()  */
        
        
private function ejecutor_devolver_array($elemento){
            static 
$indice=0;
            
$this->params_aux[$indice] = $elemento;
            
$indice++;
        }
        
        
/* Ejecutor que se ha de ejecutar tras comprobar que el elemento es de tipo jpg. Crea una thumb (miniatura)
            de la imagen y la guarda en la misma carpeta, si esta no existe ya.
            
            Para su correcto funcionamiento el array $params ha de tener en la posición 0 la escala a la que queremos
            crear el thumb (número de cero a uno) y en la posición uno la calidad de la compresión (número de cero a cien). */
            
        
private function ejecutor_crear_thumb($elemento){
        
            
// Comprobamos que la imagen no es ya una miniatura
            
if (!substr_count($elemento'_thumb'))  // Esta comprobación se podría sacar a un filtro en un futuro
            
{
                
$ruta$this->ruta;
                
$escala $this->params[0];
                
$compresion $this->params[1];
                
$ruta_completa $ruta."/".$elemento;
                
                
$file_name explode('.',$elemento);
                
$name $file_name[0];
                    
                
$ruta_a_comprobar $ruta."/".$name."_thumb.jpg";
                    
                
// Comprobamos que no existe ya el thumb
                
if(!@GetImageSize($ruta_a_comprobar))
                {
                    
// Cargamos la imagen original
                    
$original imagecreatefromjpeg($ruta_completa);
                    
                    
$ancho imagesx($original);
                    
$alto imagesy($original);
                
                    
$ancho_thumb $ancho*$escala;
                    
$alto_thumb $alto*$escala;
                    
                    
// Creamos la imagen thumb
                    
$thumb imagecreatetruecolor($ancho_thumb,$alto_thumb);
                    
                    
// Se copia la imagen
                    
imagecopyresampled($thumb,$original,0,0,0,0,$ancho_thumb,$alto_thumb,$ancho,$alto);
                    
                    
// Se guarda la imagen
                    
imagejpeg($thumb,$ruta_a_comprobar,$compresion);
                        
                }
            }
        }
        
        
/* Ejecutor que se encarga de eliminar del directorio especificado en $this->ruta el $elemento pasado como argumento.  
        
            Guarda en el array $params_aux la respuesta de la función unlink para el elemento, por si se quiere hacer una 
            comprobación posterior de que el borrado se ha hecho correctamente*/

        
private function ejecutor_eliminador($elemento){
            static 
$indice 0;
            
$ruta_completa $this->ruta."/".$elemento;
            if(
unlink($ruta_completa))
                
$this->params_aux[$indice] = $elemento." borrado OK";
            else
                
$this->params_aux[$indice] = $elemento." borrado ERROR";

        }

    
    }


?>
Anexo a estas clases se presenta un script de ejemplo de utilización de estas, además de un directorio llamado img cuyo contenido es usado en las pruebas.

Código PHP:


<?php

    
/* Script que muestra varios ejemplos de utilización de la clases directorio, filtro y ejecutor.
    *    
    *    Desarrollada por: José Raúl Ruiz Sarmiento.    Versión: 0.1
    *    
    *    Esta clase es de libre utilización y modificación para cualquier proposito, siempre y cuando no se
    *    elimine este texto. De ninguna manera se asegura el correcto funcionamiento de este script.
    *
    *    Cualquier aportación o detección de errores puede notificarse a: [email protected]        
    */
    
    // Incluimos las clases que vamos a utilizar
    
    
include_once('filtro.php');
    include_once(
'ejecutor.php');
    include_once(
'directorio.php');
    
    echo 
"<br /><b> EJEMPLO DE RESULTADOS OBTENIDOS </b><br /><br />";
    
    
/* PRIMER CASO DE PRUEBA */
    
    // En este caso de prueba vamos a usar el filtro más simple, que deja pasar todos los elementos, y el ejecutor más simple, 
    // que imprime por pantalla  el elemento que recibe
    
    
echo "<br /> PRIMER CASO DE PRUEBA <br />";

    
// Inicializamos las variables que vamos a necesitar pasar como argumentos a los constructores
    
    // Ruta del directorio con el que vamos a trabajar, en este caso img
    
$ruta "./img";
    
    
// Nombre del primer filtro que vamos a utilizar
    
$nombre_filtro "filtro_no_filtrar";
    
    
// Nombre del primer ejecutor que vamos a utilizar
    
$nombre_ejecutor "ejecutor_mostrar";
    
    
// Creamos los objetos necesarios como instancias de las clases
    
    
$filtro = new Filtro($ruta,$nombre_filtro);
    
$ejecutor = new Ejecutor($ruta,$nombre_ejecutor);
    
$dir = new Directorio($ruta,$filtro,$ejecutor);
    
    
// Ejecutamos el método ejecutar, que lanzará el recorrido sobre el directorio aplicando a los elementos del mismo que pasen el filtro el ejecutor
    
    
$dir->ejecutar();
    
    
// El ejecutor mostrar ya muestra el mismo los resultados, por lo que no necesitamos mostrarlos aquí.
    
    
    /* SEGUNDO CASO DE PRUEBA */
    
    // En este segundo caso de prueba se va a utilizar un filtro que nos dice si un fichero es mayor que un número umbral, y un ejecutor que almacena
    // el elemento en su array $params_aux, del cual podremos extraer el resultado tras ejecutarlo.
    
    
echo "<br /> SEGUNDO CASO DE PRUEBA <br />";
    
    
// Editamos los nombres del filtro y el ejecutor que vamos a utilizar    
    
$filtro->set_nombre_filtro("filtro_tamano_de_fichero");
    
$ejecutor->set_nombre_ejecutor("ejecutor_devolver_array");
    
    
// Editamos los parámetros que va a tener almacenado el filtro
    
$params[0] = 1;
    
$params[1] = 200;    
    
    
$filtro->set_params($params);
    
    
// Ejecutamos de nuevo el proceso sobre el directorio
    
$dir->ejecutar();
    
    
// Obtenemos los resultados del array $params_aux del ejecutor
    
$res $ejecutor->get_params_aux();
    
    
// Mostramos los resultados por pantalla
    
$i 0;
    while( 
$res[$i] )
    {
        echo 
"<br />Elemento ".$i." : ".$res[$i];
        
$i++;
    }
    
    
    
/* TERCER CASO DE PRUEBA */
    
    // En este segundo caso de prueba se va a utilizar un filtro que nos dice si un fichero es mayor que un número umbral, y un ejecutor que almacena
    // el elemento en su array $params_aux, del cual podremos extraer el resultado tras ejecutarlo.
    
    
echo "<br /><br /> TERCER CASO DE PRUEBA <br />";
    
    
// Editamos los nombres del filtro y el ejecutor que vamos a utilizar    
    
$filtro->set_nombre_filtro("filtro_es_de_tipo");
    
$ejecutor->set_nombre_ejecutor("ejecutor_crear_thumb");
    
    
// Editamos los parámetros de los objetos filtro y ejecutor
    
$params[0] = array ("jpg","JPG");
    
$filtro->set_params($params);    
    
    
$params[0]=0.2;
    
$params[1]=90;    
    
$ejecutor->set_params($params);
    
    
// Ejecutamos de nuevo el proceso sobre el directorio y mostramos por pantalla el número de imágenes a las que habría que crear un thumb, si no existiera
    // ya la miniatura de la misma
    
echo "<br /> Imagenes a las que crear una miniatura: ".$dir->ejecutar();
    

?>

TODO
Aumentar el número de filtros y ejecutadores aplicables a los elementos de un directorio.
Dotar al método ejecutar de la clase directorios de la posibilidad de examinar también el contenido de subdirectorios.
Aumentar la documentación de las clases.


Desarrollada por: José Raúl Ruiz Sarmiento. Versión: 0.1

Los filtros y ejecutores aquí mostrados son simples ejemplos, se pueden crear muchos más y muy potentes. ¡Animo a todo aquel que tenga en mente alguno lo exponga!

Descargable desde aquí v0.1

Descargable desde aquí v0.2

Última edición por TiempoMuerto; 08/02/2009 a las 09:53