Pequeño calendario con PHP y jQuery

27-08-2009 Tutoriales, Programación 44905 hits (100 %) 16 comentarios

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.

autor image Jesus Liñan
Programador de software, especializado en web sacando provecho de todos los recursos de la internet para el desarrollo y diseño web y compartiendolo con todos. Seguir @jesusvld

Advertisement

16 comentarios a "Pequeño calendario con PHP y jQuery"

  1. Hola, muy chulo tu calendario. Làstima que no actualice las fechas, no se porque ocurrirá. Alguna idea?
  2. 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): <?php
    $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>";
    }?>.
    por la lenia entre 34 41
  3. 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.
  4. Excelente guia amigo, muchas gracias.
  5. No puedo legir 28 de febrero de 2010 porque solo me muestra 27 dias!!! qué hago ??
  6. 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
  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. 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.
  9. 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.
  10. perdón quice decir otrro día com lunes
  11. cargar mas ...

Comentar