Je dois faire un module de réservation de salles pour mon boulot, et il faut un calendrier.
j'en avais déjà un, mais super compliqué, avec des trucs dans tous les sens.
Donc je me suis penché dessus cet après-midi en essayant de faire un truc hyper compact.
Il tient en 15 lignes de code...
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<title>Calendrier</title>
</head>
<body>
<?
setlocale(LC_TIME, "fr");
//Si le mois et l'année ne sont pas demandés, alors on utilise le mois en cours
if (!isset($_GET['mois'])) $_GET['mois'] = date("m");
if (!isset($_GET['annee'])) $_GET['annee'] = date("Y");
//On calcule les mois et années pour précédent et suivant
list($mois_suivant,$annee_suivant) = explode("-",strftime("%m-%Y",mktime(0,0,0,$_GET['mois']+1,1,$_GET['annee'])));
list($mois_precedent,$annee_precedent) = explode("-",strftime("%m-%Y",mktime(0,0,0,$_GET['mois']-1,1,$_GET['annee'])));
//Nettoyage de l'URL
$url = ereg_replace("mois=".$_GET['mois']."&annee=".$_GET['annee'],"",$_SERVER['QUERY_STRING']);
if($url != '') $url.="&";
?>
<table width="140" border="0" cellspacing="1" cellpadding="5">
<tr>
<td><a href="?<? echo $url; ?>mois=<? echo $mois_precedent; ?>&annee=<? echo $annee_precedent; ?>">-</a></td>
<td colspan="5" align="center"><? echo ucwords(strftime("%B %Y",mktime(0,0,0,$_GET['mois'],1,$_GET['annee']))); ?></td>
<td><a href="?<? echo $url; ?>mois=<? echo $mois_suivant; ?>&annee=<? echo $annee_suivant; ?>">+</a></td>
</tr>
<tr>
<td width="20">Lu</td>
<td width="20">Ma</td>
<td width="20">Me</td>
<td width="20">Je</td>
<td width="20">Ve</td>
<td width="20">Sa</td>
<td width="20">Di</td>
</tr>
<?
/*
On calcule la position de chaque jour dans la semaine.
Sachant que Lundi = 0 et Dimanche = 6.
*/
for($i='1'; $i <= cal_days_in_month(CAL_GREGORIAN,$_GET['mois'],$_GET['annee']); $i++)
{
$position_jour_semaine[] = strftime("%w",mktime(0,0,0,$_GET['mois'],$i,$_GET['annee']));
};
//On va gérer l'affichage du calendrier
for($i='0', $case_tableau='1'; $i<sizeof($position_jour_semaine); $i++)
{
if($case_tableau=='8') $case_tableau='1';
$jour = $position_jour_semaine[$i];
if($jour=='0') $jour='7';
if($case_tableau=='1') echo '<tr>';
//On a 7 cases, il faut vérifier que la valeur de $position_jour_semaine vaut $case_tableau pour l'afficher
//On progresse façon "bataille navale"
//Tant que notre jour de début n'est pas égal à la case du tableau
while($jour!=$case_tableau)
{
//On rempli la case de vide
echo '<td> </td>';
//Et on avance d'une case
$case_tableau++;
};
//Par contre quand le jour est égal à la case du tableau
if($jour==$case_tableau)
{
//On écrit le jour du mois dedans
if(($i+1==date('d')) AND ($_GET['mois']==date('m')))
{
echo '<td><strong>'.($i+1).'</strong></td>';
}
else
{
echo '<td>'.($i+1).'</td>';
};
//On avance d'une case dans notre tableau
$case_tableau++;
};
//Si on arrive à 8 c'est qu'on a fini la ligne, donc on ferme la balise
if($case_tableau=='8') echo '</tr>';
};
//On calcule pour les cas où on sort avant d'arriver à 8 dans le tableau.
while($case_tableau < '8')
{
echo '<td> </td>';
$case_tableau++;
};
?>
</tr>
</table>
</body>
</html>
Il reste à peaufiner le passage d'un mois à un autre (un petit mktime rapide devrait le faire).La mise en page est rustre, je sais.
Voilà !
Si ça peut aider des gens qui n'ont pas envie d'un truc massif.
Si vous ne comprenez pas tout, je peux expliquer le total, c'est très tortueux comme raisonnement
Edit du 03/03:
- Tableau plus joli
- Prise en compte du + et du -
- Majuscule sur le nom du mois
- Prise en compte de l'URL d'appel: les paramètres de mois et d'année sont placés en fin d'URL