- Fil d'ariane : Accueil du devBlog
- / Détail du billet (Lien direct)
Afficher un calendrier, en PHP et CSS
mEga (mEga-Box), m'a inspiré pour ce petit billet dans lequel je vous propose un petit script pour générer un calendrier en PHP et le mettre en page en CSS.
Présentation
Dans mon exemple j'ai séparé le code en un fichier index principal et trois fichiers à inclure (string.inc.php, calendrier.inc, calendrier.css). Le calendrier généré ne contient pas de tableau mais une liste d'éléments.
string.inc.php contient des fonctions de gestion de chaines:
// fonctions utiles, $valeur représente une date au format AAAA-MM-JJ
function getSecond($valeur) {
return substr($valeur, 17, 2);
}
function getMinute($valeur) {
return substr($valeur, 14, 2);
}
function getHour($valeur) {
return substr($valeur, 11, 2);
}
function getDay($valeur) {
return substr($valeur, 8, 2);
}
function getMonth($valeur) {
return substr($valeur, 5, 2);
}
function getYear($valeur) {
return substr($valeur, 0, 4);
}
function monthNumToName($mois) {
$tableau = Array("", "Janvier", "Février", "Mars", "Avril", "Mai", "Juin", "Juillet", "Aôut", "Septembre", "Octobre", "Novembre", "Décembre");
return (intval($mois) > 0 && intval($mois) < 13) ? $tableau[intval($mois)] : "Indéfini";
}
calendrier.inc.php, contient le script générant le calendrier:
// Fonction pour afficher le calendrier
function showCalendar($periode) {
$leCalendrier = "";
// Tableau des valeurs possibles pour un numéro de jour dans la semaine
$tableau = Array("0", "1", "2", "3", "4", "5", "6", "0");
$nb_jour = Date("t", mktime(0, 0, 0, getMonth($periode), 1, getYear($periode)));
$pas = 0;
$indexe = 1;
// Affichage du mois et de l'année
$leCalendrier .= "\n\t<h2>» " . monthNumToName(getMonth($periode)) . " " . getYear($periode) . "</h2>";
// Affichage des entêtes
$leCalendrier .= "
<ul id=\"libelle\">
\t<li>L</li>
\t<li>M</li>
\t<li>M</li>
\t<li>J</li>
\t<li>V</li>
\t<li>S</li>
\t<li>D</li>
</ul>";
// Tant que l'on n'a pas affecté tous les jours du mois traité
while ($pas < $nb_jour) {
if ($indexe == 1) $leCalendrier .= "\n\t<ul class=\"ligne\">";
// Si le jour calendrier == jour de la semaine en cours
if (Date("w", mktime(0, 0, 0, getMonth($periode), 1 + $pas, getYear($periode))) == $tableau[$indexe]) {
// Si jour calendrier == aujourd'hui
$afficheJour = Date("j", mktime(0, 0, 0, getMonth($periode), 1 + $pas, getYear($periode)));
if (Date("Y-m-d", mktime(0, 0, 0, getMonth($periode), 1 + $pas, getYear($periode))) == Date("Y-m-d")) {
$class = " class=\"itemCurrentItem\"";
}
else {
// 1 est toujours vrai => on affiche un lien à chaque fois
// A vous de faire les tests nécessaire si vous gérer un agenda par exemple
if (1) {
$class = " class=\"itemExistingItem\"";
$afficheJour = "<a href=\"\">" . Date("j", mktime(0, 0, 0, getMonth($periode), 1 + $pas, getYear($periode))) . "</a>";
}
else {
$class = "";
}
}
// Ajout de la case avec la date
$leCalendrier .= "\n\t\t<li$class>$afficheJour</li>";
$pas++;
}
//
else {
// Ajout d'une case vide
$leCalendrier .= "\n\t\t<li> </li>";
}
if ($indexe == 7 && $pas < $nb_jour) { $leCalendrier .= "\n\t</ul>"; $indexe = 1;} else {$indexe++;}
}
// Ajustement du tableau
for ($i = $indexe; $i <= 7; $i++) {
$leCalendrier .= "\n\t\t<li> </li>";
}
$leCalendrier .= "\n\t</ul>\n";
// Retour de la chaine contenant le Calendrier
return $leCalendrier;
}
Utilisation
Il suffit d'appeler la fonction showCalendar() en passant en paramètre le mois et l'année sous la forme YYYY-MM.
Pour le mois en cours:
echo showCalendar(date("Y-m"));
Ne pas oublier
- Pour voir la feuille de style, cliquez ici
- Pour voir l'exemple, cliquez ici
- La partie archive de ce blog affiche également un calendrier via cette technique. Voir Les archives.
Commentaires
[#3] Commentaire rédigé le Dimanche 13 Mars 2005 à 15:57 par Olivier Cartagena
[#5] Commentaire rédigé le Dimanche 20 Mars 2005 à 05:16 par Olivier
Olivier
[#7] Commentaire rédigé le Mercredi 25 Mai 2005 à 14:54 par youte
Je recherche ce genre de calendrier depuis un bout de temps mais à part des vieux exemples en javascript auquels je ne comprenais vraiment rien, c'était pas vraiment la joie...
Merci encore.
[#8] Commentaire rédigé le Jeudi 26 Mai 2005 à 10:34 par mere-teresa
Bref : la base !
[#9] Commentaire rédigé le Mardi 31 Mai 2005 à 19:05 par Olivier Sackhouse
[#10] Commentaire rédigé le Vendredi 17 Juin 2005 à 10:51 par Rémi
Tout d'abord, merci pour ton calendrier que j'aimerais intégrer sur mon site. Cependant, comme je suis encore débutant
En fait, j'aimerais avoir la possibilité de passer d'un mois à l'autre via un formulaire comme tu le fais dans la ta page : http://www.sutekidane.net/labo/php/calendrier/inde... Le problème c'est que je n'arrive pas à avoir le "vrai" code source de cette page.
Et en plus, j'aimerais qu'il n'y ait pas de lien sur les dates antérieures à la date du jour.
Est-ce possible? Si oui, peux-tu me donner de l'aide?
Encore merci car sans des gens comme toi, les débutants resteraient débutants.
A bientot j'espère
[#11] Commentaire rédigé le Samedi 09 Juillet 2005 à 17:37 par antoine
comme tu le dis j'ai inclus les 2 fichiers PHP et la feuille CSS par un link .... mais il y a des messages d'errur qui s'afichent : Warning: main(calendrier.inc): failed to open stream: No such file or directory in c:\documents and settings\antoine.portable\mes documents\test php\calendrier.php on line 3
Warning: main(): Failed opening 'calendrier.inc' for inclusion (include_path='.;C:/Program Files/EasyPHP1-8\php\pear\') in c:\documents and settings\antoine.portable\mes documents\test php\calendrier.php on line 3
ainsi que le contenu du premier fichier qui s'affiche
merci encore pour ce code qui est super
[#12] Commentaire rédigé le Mercredi 14 Septembre 2005 à 16:17 par Snid
j'ai réalisé un agenda perso online complet en php, si vous voulez voir ce que ca donne c'est ici: http://www.yemen.sup.fr
[#13] Commentaire rédigé le Vendredi 16 Septembre 2005 à 13:55 par pierre
Tout d'abord, merci de partager ton savoir.
Je suis vraiment débutant, mais j'ai pu faire fonctionner ton calendrier. J'ai néanmoins dû rajouter 'list-style: none;' sur #libelle li et .ligne li.
J'aurais une question à te poser:
En glissant le pointeur de la souris sur une journée du calendrier, comment puis-je récupérer la valeur du jour concerné dans une variable ?
Merci d'avance,
[#15] Commentaire rédigé le Samedi 24 Septembre 2005 à 12:35 par Anthony
[#16] Commentaire rédigé le Samedi 18 Février 2006 à 17:04 par Winny
ben oui encore un novice qui aimerais utiliser ce Script...
merci beaucoup!
[#17] Commentaire rédigé le Mercredi 22 Février 2006 à 17:01 par Grégoire
[#18] Commentaire rédigé le Jeudi 23 Février 2006 à 17:51 par Viper82
donc ce sript m'as l'air bien...
Si, je ne sais pas si le bug est connu... mon site meurt avant 2038 car a partir de janvier 2038 le script bug.... c louche, j'ai pas vraiment essxayer de voir si je trouvais une solution, mais si vous pouviez m'en dire un peu plus, je me met un ptit signé sur cette page, si l'auteur, pouvais me contacter par mail pour m'en dire un peu plus long ??
ce serais très très sympa
[#19] Commentaire rédigé le Samedi 11 Mars 2006 à 11:02 par Viper82
L'utilisation de list est vraiment optimale pour la validation W3C
petit commentaire... j'ai ajouté une limitation sur la date...
SI année supérieur à 2037 alors on n'affiche pas le bouton pour aller a une date supérieur... ca evite le bug car date() en php ne va pas plus loin que le 19/01/2038 voila voila
mais merci bcp!!
[#20] Commentaire rédigé le Samedi 11 Mars 2006 à 19:21 par Picsou
Serait ce une prémonition
[#21] Commentaire rédigé le Samedi 25 Mars 2006 à 12:57 par dani
[#22] Commentaire rédigé le Vendredi 31 Mars 2006 à 12:20 par Viper82
pour l'histoire de date, c'est la fonction php Date() qui se termine en 2038.... Youpi
[#23] Commentaire rédigé le Jeudi 27 Avril 2006 à 23:25 par Manu
J'ai essayé de reprendre ton script car il me paraissait très intéressant mais impossible d'afficher quoi que ce soit.
Je dois m'être trompé en incluant les différents fichiers mais pourtant je ne vois pas où...
Pourrais-tu être un peu plus précis concernant cette inclusion stp?
Merci beaucoup
[#24] Commentaire rédigé le Jeudi 11 Mai 2006 à 08:17 par madjid
pourriez vous m'aidez.
Cordialement
L'ajout de commentaire a été désactivé pour ce billet.
Trackbacks
Pisteurs vers ce billet (trackbacks entrant)
Il n'y a pas encore de pisteurs pour ce billet.
Pistés par ce billet (trackbacks sortant)
Il n'y a pas encore de pisteurs effectué par ce billet.


[#1] Commentaire rédigé le Jeudi 20 Janvier 2005 à 15:04 par Olivier Cartagena