Tema: Calendarios y Fechas
Pregunta: ¿Cómo creo un calendario de con días y meses donde los vínculos solo lleguen hasta el dia, mes y año actual?
Respuesta: Bueno a lo mejor muchos se han visto en este problema de crear calendario para mantener las cosas y realizar consultas a BDatos obtniendo las mismas por fechas. El calendario Consta de 4 funciones básicas:
Código PHP:
DiaSemana($dia,$mes,$ano);
NombreMes($mes);
ultimoDia($mes,$ano);
Calendar($mes,$ano);
En la función DiaSemana($dia,$mes,$ano) lo que hacemos es devolver el día de la semana numéricamente, o sea, 1,2,3,4,5,6,7 según corresponda.
Código PHP:
function DiaSemana($dia,$mes,$ano){
$numerodiasemana = date('w', mktime(0,0,0,$mes,$dia,$ano));
if($numerodiasemana == 0){ $numerodiasemana = 6; } else { $numerodiasemana--; }
return $numerodiasemana;
}
En la función NombreMes($mes) lo que hacemos es darle nombre a los meses ya que la función date() de PHP los devuelve pero en Inglés.
Código PHP:
function NombreMes($mes){
switch ($mes){
case 1: $nombre = "Ene"; break;
case 2: $nombre = "Feb"; break;
case 3: $nombre = "Mar"; break;
case 4: $nombre = "Abr"; break;
case 5: $nombre = "May"; break;
case 6: $nombre = "Jun"; break;
case 7: $nombre = "Jul"; break;
case 8: $nombre = "Ago"; break;
case 9: $nombre = "Sep"; break;
case 10: $nombre = "Oct"; break;
case 11: $nombre = "Nov"; break;
case 12: $nombre = "Dic"; break;
}
return $nombre;
}
En la función ultimoDia($mes,$ano) lo que hacemos es calcular el último día que tiene el mes con el cual estamos construyendo el calendario para así construir la tabla con todos los días.
Código PHP:
function ultimoDia($mes,$ano){
$ultimo_dia=28;
while (checkdate($mes,$ultimo_dia + 1,$ano)){ $ultimo_dia++; }
return $ultimo_dia;
}
Código PHP:
# Calendario de meses
function Calendar($mes,$ano){
$nombremes = NombreMes($mes);
$mes_anterior = $mes - 1;
$ano_anterior = $ano;
if ($mes_anterior == 0){
$ano_anterior--;
$mes_anterior = 12;
}
$mes_siguiente = $mes + 1;
$ano_siguiente = $ano;
if ($mes_siguiente==13){
$ano_siguiente++;
$mes_siguiente=1;
}
echo "<table width='100' border='0' cellspacing='0' cellpadding='0' align='center'>";
echo "</table>";
echo "<table width='100' border='0' cellspacing='0' cellpadding='0' align='center' class='calendar'>";
echo "<tr><td colspan='7' class='normal fontbig bold alterno calendar' align='center'><a href='".basename($_SERVER['PATH_TRANSLATED'])."?mes=".($mes_anterior)."&ano=".($ano_anterior)."&sid=".session_id()."'><< </a> ".$nombremes." ".$ano." <a href='".basename($_SERVER['PATH_TRANSLATED'])."?mes=".($mes_siguiente)."&ano=".($ano_siguiente)."&sid=".session_id()."'>>> </a></td></tr>";
echo "<tr>";
echo "<td align='center' bgcolor='#F0F8FE'>D</td>";
echo "<td align='center' bgcolor='#F0F8FE'>L</td>";
echo "<td align='center' bgcolor='#F0F8FE'>M</td>";
echo "<td align='center' bgcolor='#F0F8FE'>M</td>";
echo "<td align='center' bgcolor='#F0F8FE'>J</td>";
echo "<td align='center' bgcolor='#F0F8FE'>V</td>";
echo "<td align='center' bgcolor='#F0F8FE'>S</td>";
echo "</tr>";
$dia_actual = 1;
$numero_dia = DiaSemana(1,$mes,$ano);
$ultimo_dia = ultimoDia($mes,$ano);
$diaact = date("d");
$mesact = date("m");
$anoact = date("Y");
echo "<tr>";
for($i=-1;$i<6;$i++){
if(($dia_actual<=$diaact) && ($mes<=$mesact) && ($ano<=$anoact)){
$bgcolor = "#F0F8FE";
}elseif(($dia_actual>$diaact) && ($mes>=$mesact) || ($ano>$anoact)){
$bgcolor = "#D8D8D8";
}elseif ($mes>$mesact){
$bgcolor = "#D8D8D8";
}
if(($dia_actual<=$diaact) && ($mes<=$mesact) && ($ano<=$anoact)){
$enlace = "calendar.php?action=show&dia=".$dia_actual."&mes=".$mes."&ano=".$ano."&sid=".session_id()."";
}else{
$enlace = "";
}
if($i < $numero_dia){
echo "<td class='calendar' bgcolor='#D8D8D8'> </td>";
}else{
echo "<td align='center' bgcolor='".$bgcolor."'><a href=".$enlace."><span class='info' title='Mostrar contenido de ".($dia_actual."-".$mes."-".$ano)."'>".$dia_actual."</span></a></td>";
$dia_actual++;
}
}
echo "</tr>";
$numero_dia = 0;
while($dia_actual <= $ultimo_dia){
if(($dia_actual<=$diaact) && ($mes<=$mesact) && ($ano<=$anoact)){
$bgcolor = "#F0F8FE";
}elseif(($dia_actual>$diaact) && ($mes>=$mesact) || ($ano>$anoact)){
$bgcolor = "#D8D8D8";
}elseif ($mes>$mesact){
$bgcolor = "#D8D8D8";
}
if(($dia_actual<=$diaact) && ($mes<=$mesact) && ($ano<=$anoact)){
$enlace = "calendar.php?action=show&dia=".$dia_actual."&mes=".$mes."&ano=".$ano."&sid=".session_id()."";
}else{
$enlace = "";
}
if ($numero_dia == 0)
echo "<tr>";
echo "<td align='center' bgcolor='".$bgcolor."'><a href=".$enlace."><span class='info' title='Mostrar contenido de ".($dia_actual."-".$mes."-".$ano)."'>".$dia_actual."</span></a></td>";
$dia_actual++;
$numero_dia++;
if ($numero_dia == 7){
$numero_dia = 0;
echo "</tr>";
}
}
for ($i=$numero_dia;$i<7;$i++){
echo "<td bgcolor='#D8D8D8'> </td>";
}
echo "</tr>";
echo "</table>";
}
Se usa de esta forma. Si la tienes en un archivo externo al tuyo, donde vas a usar la función sería algo como esto:
Código PHP:
include("calendar-functions.php");
$mes = isset($_GET['mes'])?$_GET['mes']:date("m");
$ano = isset($_GET['ano'])?$_GET['ano']:date("Y");
Calendar($mes,$ano);
sino simplemente sería esto:
Código PHP:
$mes = isset($_GET['mes'])?$_GET['mes']:date("m");
$ano = isset($_GET['ano'])?$_GET['ano']:date("Y");
Calendar($mes,$ano);
espero les sirva.
Salu2