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.

17 thoughts on “Pequeño calendario con PHP y jQuery

  1. Estoy tratando de usar el Calendario para usarlo desde un PHP pero me da un error. Me muestra el campo de fecha pero al presionar sobre la palabra calendario simplemente no hace nada.
    Gracias por cualquier ayuda.

  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

  3. Este es el cambio a nivel de código…
    =$anio_min)
    {echo “”.$anio_max.” \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 “$i”;}?>
    //impresión por el select
    …. Gracias
    http://advenis.ueuo.com

  4. Que tal bueno una pregunta sobre tu codigo en esta partte ::
    Mini Calendario Web

    como estas llamando al ” ” 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

  5. 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!

  6. 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.

  7. 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

  8. 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

  9. muy bueno el codigo pero de favor necesito q me digas como le tengo q hacer para q la lista del año inicie con el año actual y no desde 1982, y en la lista del año solo sean desde el 2000 en adelante.

  10. gracias parceros le agradesco por el codigo, bueno ahora que ya tengo mi web es preguntarles una ves mas ¿como? hago que el el dia esté con visible para que usuarios vean que dia estamos por que todos llevan el mismo color quiero cambien el color de ese dia o dia actual .. je je je hasta yo ya me confondí pero de ante mano ojala me comprende lo que le quiero decir gracias . lo del aparesca el año actual es este codigo(gracia Luis Alexzander Escobar Jiménez si no estoy mal): ($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 “$i”;
    }?>.
    por la lenia entre 34 41

  11. Hola, muy chulo tu calendario. Làstima que no actualice las fechas, no se porque ocurrirá. Alguna idea?

Leave a Reply

Your email address will not be published. Required fields are marked *

Proudly powered by WordPress | Theme: Wanderz Blog by Crimson Themes.