Ver Mensaje Individual
  #1 (permalink)  
Antiguo 06/04/2003, 21:42
Avatar de Manoloweb
Manoloweb
 
Fecha de Ingreso: enero-2002
Ubicación: Monterrey
Mensajes: 2.454
Antigüedad: 22 años, 3 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