
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ércoles","Jueves","Viernes","Sá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->mesDespliega= strtotime ($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."><<</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.">>></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> </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> </td>\n";
}
$rellenoFin.=" </tr>\n";
$sale.=$rellenoFin;
}
$sale.=" </table>";
$sale.=" </td>\n";
$sale.=" </tr>\n";
$sale.=" <tr>\n";
$sale.=" <td>\n";
$sale.=" ";
$sale.=" </td>\n";
$sale.=" </tr>\n";
return $sale;
}
}
