Pequeño calendario con PHP y jQuery

Web calendarHace poco en un artículo explicando un mantenimiento de datos con PHP, MySQL y AJAX (con jQuery) adjunte un pequeño calendario hecho con PHP. No pude explicar su funcionamiento, pero ahora lo haré rapidamente. No se trata de un calendario avazando y con muchas opciones de configuración, pero es funcional para salir de apuros. Espero les sea de utilidad. [Ver demo] [Descargar]

El archivo principal se llama calendario.php, tiene 3 funciones:

  • ultimoDia, nos averigua el último día del mes y año a mostrar con fin de totalizar los días que se mostrarán en un tabla html.
  •  calendar_html, muestra la cabecera del calendario un combo select para mes y otro para el año. También muestra los días según el mes y año llamando a la función calendar.
  • calendar, arma una tabla html para mostrar los días según mes y año seleccionados.
<?php
function ultimoDia($mes,$ano){
$ultimo_dia=28;
while (checkdate($mes,$ultimo_dia + 1,$ano)){
$ultimo_dia++;
}
return $ultimo_dia;
}

function calendar_html(){
$meses= array('Enero','Febrero','Marzo','Abril','Mayo','Junio','Julio','Agosto','Septiembre','Octubre','Noviembre','Diciembre');
//$fecha_fin=date('d-m-Y',time());
$mes=date('m',time());
$anio=date('Y',time());
?>
<table style="width:200px;text-align:center;border:1px solid #808080;border-bottom:0px;" cellpadding="0" cellspacing="0">
<tr>
<td colspan="4">
<select id="calendar_mes" onchange="update_calendar()">
<?php
$mes_numero=1;
while($mes_numero<=12){
if($mes_numero==$mes){
echo "<option value=".$mes_numero." selected=\"selected\">".$meses[$mes_numero-1]."</option> \n";
}else{
echo "<option value=".$mes_numero.">".$meses[$mes_numero-1]."</option> \n";
}
$mes_numero++;
}
?>
</select>
</td>
<td colspan="3">
<select style="width:70px;" id="calendar_anio" onchange="update_calendar()">
<?php
// años a mostrar
$anio_min=$anio-30; //hace 30 años
$anio_max=$anio; //año actual
while($anio_min<=$anio_max){
echo "<option value=".$anio_min.">".$anio_min."</option> \n";
$anio_min++;
}
?>
</select>
</td>
</tr>
</table>
<div id="calendario_dias">
<?php calendar($mes,$anio) ?>
</div>
<?php
}

function calendar($mes,$anio){
$dia=1;
if(strlen($mes)==1) $mes='0'.$mes;
?>
<table style="width:200px;text-align:center;border:1px solid #808080;border-top:0px;" cellpadding="0" cellspacing="0">
<tr style="background-color:#CCCCCC;">
<td>D</td>
<td>L</td>
<td>M</td>
<td>M</td>
<td>J</td>
<td>V</td>
<td>S</td>
</tr>
<?php

//echo $mes.$dia.$anio;
$numero_primer_dia = date('w', mktime(0,0,0,$mes,$dia,$anio));
$ultimo_dia=ultimoDia($mes,$anio);

$total_dias=$numero_primer_dia+$ultimo_dia;

$diames=1;
//$j dias totales (dias que empieza a contarse el 1º + los dias del mes)
$j=1;
while($j<$total_dias){
echo "<tr> \n";
//$i contador dias por semana
$i=0;
while($i<7){
if($j<=$numero_primer_dia){
echo " <td></td> \n";
}elseif($diames>$ultimo_dia){
echo " <td></td> \n";
}else{
if($diames<10) $diames_con_cero='0'.$diames;
else $diames_con_cero=$diames;

echo " <td><a style=\"display:block;cursor:pointer;\" onclick=\"set_date('".$anio."-".$mes."-".$diames_con_cero."')\">".$diames."</a></td> \n";
$diames++;
}
$i++;
$j++;
}
echo "</tr> \n";
}
?>
</table>
<?php
}
?>

Otro proceso importante lo encontramos en el archivo setvalues.php, este archivo sirve de puente para las llamadas AJAX, entre la funcion JavaScript que llamará al calendario y la función PHP que mostrará el calendario.

<?php
require('calendario.php');
$mes=$_GET['month'];
$anio=$_GET['year'];
$dia=1;
calendar($mes,$anio);
?>

Como se puede apreciar solo llama a la función calendar, osea la que se encarga de armar la tabla html con los días a mostrar según los parametros $mes y $anio. Pero ... ¿de donde se obtiene estos valores?

Veamos las funciones JavaScript del archivo jquery.functions.js:

  • update_calendar, obtiene los valores de los combo select mes y anio para capturar dichos valores y así realizar una petición al archivo setvalues.php contestando así la pregunta anterior.
  • set_date, establece la fecha seleccionada en el text input deseado y oculta el calendario.
  • show_calendar, muestra u oculta el calendario.
// funciones del calendario

$(document).ready(function(){
//div donde se mostrará calendario debe estar oculto
$('#calendario').hide();
});

function update_calendar(){
var month = $('#calendar_mes').attr('value');
var year = $('#calendar_anio').attr('value');

var valores='month='+month+'&year='+year;

$.ajax({
url: 'setvalue.php',
type: "GET",
data: valores,
success: function(datos){
$("#calendario_dias").html(datos);
}
});
}

function set_date(date){
//input text donde debe aparecer la fecha
$('#fecha').attr('value',date);
show_calendar();
}

function show_calendar(){
//div donde se mostrará calendario
$('#calendario').toggle();
}

Finalmente veamos su funcionamiento en este caso el archivo index.php 

<title>Mini Calendario Web</title>
<script type="text/javascript" src="js/jquery-1.3.1.min.js"></script>
<script type="text/javascript" src="js/jquery.functions.js"></script>
</head>

<body>
<form id="formulario">
<p>
<label for="fecha"> Selecciona la fecha
<input type="text" name="fecha" id="fecha" /> <a onclick="show_calendar()" style="cursor: pointer;"><small>(calendario)</small></a>
<div id="calendario">
<?php calendar_html() ?>
</div>
</label>
</p>
</form>
</body>

Como pueden apreciar:

  • llamamos a los archivos JavaScript necesarios (incluyendo jQuery)
  • incluimos un link llamando a la función show_calendar()
  • también mostramos el calendario completo dentro del div id="calendario".

El resultado lo pueden ver aqui ó descargarlo. Espero les sea útil el código para que ustedes hagan sus modificaciones ó personalicen mejor.

Comentarios Comentarios formato RSS

  1. avatar miguel angel 2010-06-08 13:10:23 11 hola solo queria saber si sepuede aplicar con dos campos de calendario, calendario inicial y calendario final, he estado modificando el codigo para hacerlo pero no he podido por favor una ayuda con el codigo de 2 campos para un formulario gracias
  2. avatar DORIAN ALDANA 2010-05-19 21:42:16 10 ME FUNCIONA DE MARAVILLA, PERO EN FORMULARIOS CON UN SOLO CAMPO DE FECHA, SI NECESITO ESTE CALENDARIO EN MAS DE UN CAMPO DE FECHA NO FUNCIONA
  3. avatar LordNext 2010-01-12 09:30:18 9 Modifique el codigo para adaptarlo a un sistema de gestion de promociones.

    Mi problema es que, a los dos ultimos campos quiero habilitarles el calendario. Ya que serian la fecha de inicio y de finalizacion de las promociones.
    Para ello, duplique los campos en actualizacion y nuevo. Y duplique las funciones en functions y jquery.functions.js . Tanto a las funciones duplicadas como a las variables les agregue un 2 para diferenciarlas, asi tambien como a los div, etc.
    Mi problema es que ahora no me funcionan los calendarios, al hacer click en un dia especifico en el calendario 2, me guarda la modificacion en el calendario 1, pero con otra fecha.

    espero puedan darme una mano.
  4. avatar Ana María 2009-12-21 22:13:59 8 Muy claro, habia intentado con otros, pero algo no me funcionaba.
    Este lo descargue y le modifique tan solo 2 lineas y funciono a la 1ra.
    Muchas Gracias.
  5. avatar richard 2009-12-05 09:21:35 7 perdón quice decir otrro día com lunes
  6. avatar richard 2009-12-05 09:17:44 6 Hola, gracias por el post. El control me parece muy funcional, pero me surge una duda. Como podría hacer para que los días de la semana empiecen por otro día, como el domingo.
    Gracias!
  7. avatar Mario 2009-11-28 13:45:34 5 Que tal bueno una pregunta sobre tu codigo en esta partte ::

    <title>Mini Calendario Web</title><script type="text/javascript" src="js/jquery-1.3.1.min.js"></script><script type="text/javascript" src="js/jquery.functions.js"></script></head><body><form id="formulario"> <p> <label for="fecha"> Selecciona la fecha <input type="text" name="fecha" id="fecha" /> <a onclick="show_calendar()" style="cursor: pointer;"><small>(calendario)</small></a> <div id="calendario"> <?php calendar_html() ?> </div> </label> </p></form></body>

    como estas llamando al "<?php calendar_html() ?> " si no en el codigo no veo un include(calendario.php) ni menos en el archivo fucntions.js solo muestra y esconde el div .. pero aque hora llama e incluye el calendario.php creo que ahi en la parte de function.js

    function show_calendar(){ //div donde se mostrará calendario $('#calendario').toggle
    // deberia llamar tamb al set.php para llamar al calendario.php y funcione bien.. o me equivoco?

    (); }
    si estoy errado por favor hasmelo entender =D !!! o sino explicame =) gracias
  8. avatar Luis Alexzander Escobar Jiménez 2009-09-11 10:20:23 4 Este es el cambio a nivel de código...
    <?php
    /* años a mostrar codigo inicial
    $anio_max=$anio; //año actual
    $anio_min=$anio_max-300; //hace 300 años
    while($anio_max>=$anio_min)
    {echo "<option value=".$anio_max.">".$anio_max."</option> \n"; $anio_min++; }*/
    //Cambio realizado
    $anio_max=date("Y");//Año base o actual for($i=$anio_max;$i>($anio_max-150);$i--)
    //Año mínimo que quiero que siempre me reste 150-actual
    {$ano=$anio_max-$i; $contar=($i-$i)+1;//Contador regresivo
    echo "<option value='$i'>$i</option>";}?>
    //impresión por el select
    .... Gracias
    http://advenis.ueuo.com
  9. avatar Luis Alexzander Escobar Jiménez 2009-09-11 10:15:39 3 Muchas gracias, le realicé cambios de diseño y puse al año mayor primero por comodidad, la verdad me has ayudado...

    Tambien los invito a empezar a aportar a mi sitio para que al igual que en este foro compartamos código y demás, mil gracias....
  10. avatar jesusvld 2009-09-08 09:52:38 2 Recuerden descargar jQuery para que las funciones en JavaScript funcionen correctamente.

    Una ayuda que te puede indicar cual es la falla es la extension firebug de firefox.

    Revisa esos dos puntos y nos avisas, estamos para ayudar.

    Saludos

Dejar un comentario