Foros del Web » Programando para Internet » PHP »

Mi primer OOP - Calendario PHP

Estas en el tema de Mi primer OOP - Calendario PHP en el foro de PHP en Foros del Web. Yo se que este pequeño desarrollo es una NADA comparado con lo que otros pueden hacer. Pero al fin es mi primer Codigo (Clase), y ...
  #1 (permalink)  
Antiguo 06/04/2003, 22:42
Avatar de Manoloweb  
Fecha de Ingreso: enero-2002
Ubicación: Monterrey
Mensajes: 2.454
Antigüedad: 15 años, 10 meses
Puntos: 5
Mi primer OOP - Calendario PHP

Yo se que este pequeño desarrollo es una NADA comparado con lo que otros pueden hacer. Pero al fin es mi primer Codigo (Clase), y como dije hace unos días, es mejor que nos convirtamos en desarrolladores que en usuarios de scripts reutilizables.

Este calendario puede ser facilmente personalizable a través de CSS sin necesidad de tocar el código, igualmente las ligas de los días, puede personalizarse MUY facilmente, y se puede decidir si dichas ligas aparecerán en todos los días, o solo en las fechas por venir, o bien solo en las fechas pasadas.

Espero que lo disfruten!!

Código PHP:
<?

/* Clase para desplegar un calendario en español
Creado por: Manolo Guerrero, Monterrey, MX
email: [email][email protected][/email]

Este script es gratuito, y puede ser utilizado, modificado
o distribuido bajo los términos de la GNU Lesser General Public
License, tal como es publicada por la Free Software Foundation.*/


Class Calendario {
    var 
$nombreMeses=array("Enero","Febrero","Marzo","Abril","Mayo","Junio","Julio","Agosto","Septiembre","Octubre","Noviembre","Diciembre");
    var 
$nombreDias=array("Domingo","Lunes","Martes","Mi&eacute;rcoles","Jueves","Viernes","S&aacute;bado");
    var 
$nombreDiasC=array("D","L","M","M","J","V","S");
    var 
$fechaHoy;
    var 
$mesDespliega;
    var 
$pruMes;
    var 
$pruYear;
    var 
$qstVariables="?";


    
    
// Constructor
    
function Calendario ($mes="no"){
        
$diadehoy=strtotime ("-1 hour");
        
$diadehoy1=date("Y/m/d",$diadehoy);
        
$diadehoy2=strtotime ($diadehoy1);
        
$this->fechaHoy$diadehoy2;
        
// Si $mes no se ha especificado, o no tiene formato válido, lo sustituimos por el actual
        
$mes = (($mes=="no" || $mes=="") || preg_match("/[0-9]{4}/",$mes)==0) ? date("ym",strtotime ("-1 hour")) : $mes;
        
$this->mesDespliegastrtotime ($mes."01");
        
$this->pruMes=substr($mes,2,2);
        
$this->pruYear=substr($mes,0,2);
    }
    

    
    
// Función para rescatar las variables del query string,
    // Recibe los nombres separados por el signo de # (sin espacios)
    
function RescataVariables ($variablesLista){
        
$variablesArray=explode ("#",$variablesLista);
        foreach (
$variablesArray as $a){
            
$this->qstVariables.=$a."=".$_GET[$a]."&";
        }
    }
    
    
        
    
// Estas dos funciones crean el link para el mes siguiente y anterior
    
function linkMesSig (){
        
$esteMes=$this->pruMes
        
$esteYear=$this->pruYear;
        If ((
$esteMes+=1)>12) { 
            
$esteYear+=1;
            
$esteMes-=12  ;
        } 
        return 
$this->qstVariables."mes=".str_pad($esteYear,2,"0",STR_PAD_LEFT).str_pad($esteMes,2,"0",STR_PAD_LEFT);
    }

    function 
linkMesAnt (){
        
$esteMes=$this->pruMes
        
$esteYear=$this->pruYear;
        If ((
$esteMes-=1)<=0) { 
            if ((
$esteYear-=1)<0) { $esteYear+=100; }
            
$esteMes+=12  ;
        } 
        return 
$this->qstVariables."mes=".str_pad($esteYear,2,"0",STR_PAD_LEFT).str_pad($esteMes,2,"0",STR_PAD_LEFT);
    }
    
    
    
    
// Función para traer todos los datos necesarios del mes
    
function datosMes () {
        
$usaGet=getdate($this->mesDespliega);
        
$mesCal["primerdia"]=$usaGet["wday"];
        
$mesCal["totaldias"]=date("t",$this->mesDespliega);
        
$mesCal["nombremes"]=$this->nombreMeses[(date("n",$this->mesDespliega))-1];
        
$mesCal["year"]=$usaGet["year"];
        return 
$mesCal;
    }
        
    
// Funcion para aplicar estilos al calendario
    
var $estAplica=0;
    var 
$estTabla="";
    var 
$estHead="";
    var 
$estHead2="";
    var 
$estOrejas="";
    var 
$estDomingos="";
    var 
$estNormales="";
    var 
$estDeshab="";
    var 
$estLigadia="";
    var 
$estLigames="";
    
    function 
estilos ($tabla="",$head="",$head2="",$orejas="",$domingos="",$normales="",$deshab="",$ligadia="",$ligames="") {
        
$this->estAplica=1;
        
$this->estTabla= ($tabla=="") ? "" " class=\"".$tabla."\"";
        
$this->estHead= ($head=="") ? "" " class=\"".$head."\"";
        
$this->estHead2= ($head2=="") ? "" " class=\"".$head2."\"";
        
$this->estOrejas= ($orejas=="") ? "" " class=\"".$orejas."\"";
        
$this->estDomingos= ($domingos=="") ? "" " class=\"".$domingos."\"";
        
$this->estNormales= ($normales=="") ? "" " class=\"".$normales."\"";
        
$this->estDeshab= ($deshab=="") ? "" " class=\"".$deshab."\"";
        
$this->estLigadia= ($ligadia=="") ? "" " class=\"".$ligadia."\"";
        
$this->estLigames= ($ligames=="") ? "" " class=\"".$ligames."\"";
    }
    
    
    
// Funcion para generar ligas de los días
    
var $ligaActiva=0;
    var 
$ligaCadena="";
    var 
$ligaTipo=0;
    var 
$ligaMismo=0;
    
    
// Las siguientes dos funciones:
    // Habilitan la liga de las fechas, recibe la variable $cadena, que es la liga textual,
    // Las ocurrencias de la cadena #D# serán sustituidas por el numero del dia, y #M#  y #A# por mes y año
    // de ese dia en formato AAAAMMDD, ademas, si tipo es 0, TODAS las fechas tendrán liga
    // si tipo es 1, solo las fechas POSTERIORES serán ligadas, con -1 solo las ANTERIORES se
    // habilitaran con liga (en ambos casos se incluye el dia en curso)
    // si $mismo se ingresa con valor de 1, toda la liga se sustituye por una liga a la misma
    // pagina, agregando la variable GET["dia"]
    
function liga($cadena="",$tipo=0,$mismo=0) {
        
$this->ligaActiva=1;
        
$this->ligaCadena=$cadena;
        
$this->ligaTipo=$tipo;
        
$this->ligaMismo=$mismo;
    }
    
    function 
poneLiga($dato) {
        if (
$this->ligaActiva==0) {
            return 
$dato;
        }
        else {
            
$ligaDia=str_pad($dato,2,"0",STR_PAD_LEFT);
            
$ligaMes=$this->pruMes;
            
$ligaYear=$this->pruYear;
            
$diadedato=strtotime($ligaYear.$ligaMes.$ligaDia);
            if (
$this->ligaMismo==1) {
                switch (
$this->ligaTipo) {
                    case -
1:
                    if (
$diadedato<=$this->fechaHoy) {
                        return 
"<a href=\"".$this->qstVariables."mes=".$this->pruYear.$this->pruMes."&dia=".$ligaDia."\"".$this->estLigadia.">".$dato."</a>";
                    } else {
                        return 
$dato;
                    }
                    break;
                    
                    case 
0:
                    return 
"<a href=\"".$this->qstVariables."mes=".$this->pruYear.$this->pruMes."&dia=".$ligaDia."\"".$this->estLigadia.">".$dato."</a>";
                    break;
                    
                    case 
1:
                    if (
$diadedato>=$this->fechaHoy) {
                        return 
"<a href=\"".$this->qstVariables."mes=".$this->pruYear.$this->pruMes."&dia=".$ligaDia."\"".$this->estLigadia.">".$dato."</a>";
                    } else {
                        return 
$dato;
                    }
                    break;
                }
                
            } else {
                
$remp[]=$ligaDia;
                
$remp[]=$ligaMes;
                
$remp[]=$ligaYear;
                
$busc[]="/#D#/";
                
$busc[]="/#M#/";
                
$busc[]="/#A#/";
                
$cadenadeliga=preg_replace($busc,$remp,$this->ligaCadena); 
                
                switch (
$this->ligaTipo) {
                    case -
1:
                    if (
$diadedato<=$this->fechaHoy) {
                        return  
"<a href=\"".$cadenadeliga."\"".$this->estLigadia.">".$dato."</a>";
                    } else {
                        return 
$dato;
                    }
                    break;
                    
                    case 
0:
                    return  
"<a href=\"".$cadenadeliga."\"".$this->estLigadia.">".$dato."</a>";
                    break;
                    
                    case 
1:
                    if (
$diadedato>=$this->fechaHoy) {
                        return  
"<a href=\"".$cadenadeliga."\"".$this->estLigadia.">".$dato."</a>";
                    } else {
                        return 
$dato;
                    }
                    break;
                }
            }
            
            
            return 
"<a href=\"".$this->ligaCadena."\"".$this->estLigadia.">".$dato."</a>";
        }
    }
    
    
    
// Funcion para generar el encabezado del calendario
    
function genera (){
        
$datos=$this->datosMes();
        
$sale="<table width=\"250\" border=\"0\" cellspacing=\"0\" cellpadding=\"0\"".$this->estTabla.">\n";
        
$sale.="  <tr>\n";
        
$sale.="    <td><table width=\"250\" border=\"0\" cellspacing=\"0\" cellpadding=\"0\"".$this->estHead.">\n";
        
$sale.="        <tr>\n";
        
$sale.="          <td width=\"25\"><a href=\"".$this->linkMesAnt()."\"".$this->estLigames.">&lt;&lt;</a></td>\n";
        
$sale.="          <td width=\"200\"><div align=\"center\">".$datos["nombremes"]." - ".$datos["year"]."</div></td>\n";
        
$sale.="          <td width=\"25\" align=\"right\"><a href=\"".$this->linkMesSig()."\"".$this->estLigames.">&gt;&gt;</a></td>\n";
        
$sale.="        </tr>\n";
        
$sale.="      </table></td>\n";
        
$sale.="  </tr>\n";
        
$sale.="  <tr>\n";
        
$sale.="  <td>\n";
        
        
$sale.="     <table width=\"250\" border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n";
        
$sale.="        <tr> \n";
        
$sale.="          <td width=\"40\" align=\"center\"".$this->estHead2."><b>D</b></td>\n";
        
$sale.="          <td width=\"35\" align=\"center\"".$this->estHead2."><b>L</b></td>\n";
        
$sale.="          <td width=\"35\" align=\"center\"".$this->estHead2."><b>M</b></td>\n";
        
$sale.="          <td width=\"35\" align=\"center\"".$this->estHead2."><b>M</b></td>\n";
        
$sale.="          <td width=\"35\" align=\"center\"".$this->estHead2."><b>J</b></td>\n";
        
$sale.="          <td width=\"35\" align=\"center\"".$this->estHead2."><b>V</b></td>\n";
        
$sale.="          <td width=\"35\" align=\"center\"".$this->estHead2."><b>S</b></td>\n";
        
$sale.="        </tr>\n";
        
        
$rellenoIni="";
        
$rellenoFin="";
        
        
// Rellena las primeras celdas antes del primer dia del mes
        
if ($datos["primerdia"]>0){
            for (
$r=0;$r<$datos["primerdia"];$r++){
                
$rellenoIni.="      <td>&nbsp;</td>\n";
            }
        }
        
        
        
// Despliega los días del mes
        
$sale.="        <tr> \n";
        for (
$d=1;$d<=$datos["totaldias"];$d++) {
            If (
$d==1) {$sale.=$rellenoIni;}
            
$sale.="          <td align=\"center\"".$this->estNormal.">".$this->poneLiga($d)."</td>\n";
            If ((
$d+$datos["primerdia"]) % 7==0) { $sale.="        </tr>\n"; }
        }
        
        
// Rellena las ultimas celdas despues del fin del mes
        
if (($datos["primerdia"]+$datos["totaldias"]) % 7>0) {
            
$faltan=($datos["primerdia"]+$datos["totaldias"]) % 7;
            for (
$f=1;$f<=(7-$faltan);$f++){
                
$rellenoFin.="      <td>&nbsp;</td>\n";
            }
            
$rellenoFin.="        </tr>\n";
            
$sale.=$rellenoFin;
        }
        
        
$sale.="     </table>";
        
        
$sale.="  </td>\n";        
        
$sale.="  </tr>\n";
        
$sale.="  <tr>\n";
        
$sale.="  <td>\n";
        
$sale.=" &nbsp;";
        
$sale.="  </td>\n";        
        
$sale.="  </tr>\n";
        return 
$sale;
    }
}
A continuación pongo las instrucciones de uso
__________________
Manoloweb
  #2 (permalink)  
Antiguo 06/04/2003, 23:06
Avatar de Manoloweb  
Fecha de Ingreso: enero-2002
Ubicación: Monterrey
Mensajes: 2.454
Antigüedad: 15 años, 10 meses
Puntos: 5
3 Metodos disponibles:

estilos (tabla, cabecera, nombreDias, orejas, domingos, normales, deshabilitados, ligaDia, ligaMes)

Aqui pueden ponerse los nombres de los estilos que el script debera usar para los diferentes elementos (tal como se llama nuestra class de CSS).

liga(cadena, tipo, mismo)

Este metodo permite colocar una liga en cada día. "cadena" es un string que permite incluir #D# donde queramos que se ponga el dia, #M# para el mes y #A# para el año. Si tipo es 0, TODAS las fechas tendran una liga, pero si es -1, solo las fechas anteriores a la fecha actual (incluida) seran linkeadas, y si es 1, solo las posteriores (incluida la actual tambien). Si "mismo" se marca como 1, la liga se sustituye por un link a la misma pagina, agregando al querystring el numero del día seleccionado.


RescataVariables("variable1#variable2#etc")

Sirve para preservar las variables de querystring a través de la navegacion por el calendario, los nombres de las variables se escriben separadas por el signo de # sin espacios.


EJEMPLOS DE USO:

Ejemplo 1: Calendario Simple, que preserva las variables de querystring "modo" y "pagina", y pone una liga hacia la misma pagina en todos los días POSTERIORES a la fecha actual, incluyendola.

Código PHP:
$prueba= New Calendario($_GET["mes"]);
$prueba->RescataVariables("modo#pagina");
$prueba->liga(0,1,1);
echo 
$prueba->genera(); 

Ejemplo 2: Calendario Simple, pone una liga hacia otra pagina, por ejemplo http://www.pagina.com?mes=03&dia=01&anio=03, la liga se despliega en TODAS las fechas.

Código PHP:
$prueba= New Calendario($_GET["mes"]);
$prueba->liga("http://www.pagina.com?mes=#M#&dia=#D#&anio=#A#",0,0);
echo 
$prueba->genera(); 
IMPORTANTE: siempre debe llamarse la Clase con $_GET["mes"], aunque no exista dicha variable de querystring.

Saludos!!!
__________________
Manoloweb

Última edición por Manoloweb; 06/04/2003 a las 23:32
  #3 (permalink)  
Antiguo 06/04/2003, 23:45
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
Podrías documentar la classe siguiendo las normas de PEAR por ejemplo .. así de un "vistazo" a la classe quedan bien claro los métodos que hay públicos .. lo que son privados y las definiciones de parámetros de cada método ..

Por ejemplo .. ademas de (opcional) describir en una frase/parrafo como funciona determinado método .. podrías usar sintax tipo cualquier manual de referencia .. ejemplo .. el mismismo de PHP ..

Un ejemplo:
liga(cadena string,[tipo int],[mismo int])

Pongo los tipo y mismo entre [] pues en la definición del método le das un valor por defecto si no está definido .. ¿por ende se ha de suponer que sea "opcional" o se asumirá por defecto esos valores .. ?

Tambien .. a la hora de definir los parámetros de (por ejemplo esté método liga() ...) podrias usar booleanos (TRUE/FALSE) en lugar de enteros 1 o -1 .. ya que el estado de estas solo es Uno u otro ..

A nivel funcional .. lo que es un Objeto (classe) siempre ha de estar lo mas separado posible de la "capa" de presentación .. En este caso sería el método genera() que compone la tabla y calendarío .. Tal vez si se hicieran mas métodos como para poder componer el HTML de ese calendario usando los métodos de este objeto (algunos internos habría que hacerlos externos ..) sería mas flexible el Objeto .. A su vez podríamos hacer un "extended" al objeto padre (tu classe) para añadir algun "genera()" propio ya definido por un usuario de tu classe.

Por supuesto .. con esto que propongo .. generar un calendarío serían bastante mas líneas de código y mas complicado de usar para .. todo esto a cambio de flexibilidad (por eso decia lo de los "extended" para qu incluyas uno básico por defecto que vendría a ser tu método genera() actual ..)

Imagina por ejemplo que yo uso un sistema de templates (Smarty .. etc) para "renderizar" mis páginas HTML via PHP .. Usando la classe tal cual está ya me "rompe" el sistema de templates .. mientras que si me ofreces métodos para generar los datos del calendario (con sus links y propagar variables del URL) podría integrarlo en mi sistema de templates ..

Por lo demas en cuanto al uso de OOP para la classe .. ahí no me méto .. xD

Si quieres ver algo de PEAR:
http://pear.php.net

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
  #4 (permalink)  
Antiguo 07/04/2003, 00:20
Avatar de Manoloweb  
Fecha de Ingreso: enero-2002
Ubicación: Monterrey
Mensajes: 2.454
Antigüedad: 15 años, 10 meses
Puntos: 5
Amigo,

Gracias por tus comentarios, seguramente voy a meterle mano a la documentacion (no sabia de que se trataba pear), y en cuanto a hacerlo más flexible, suena bien, ademas me va a servir de práctica...

__________________
Manoloweb
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 00:01.