CALENDRIER

Signaler
Messages postés
16
Date d'inscription
dimanche 11 mars 2007
Statut
Membre
Dernière intervention
22 mai 2014
-
Messages postés
276
Date d'inscription
mercredi 22 septembre 2010
Statut
Membre
Dernière intervention
8 janvier 2014
-
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/52701-calendrier

Messages postés
276
Date d'inscription
mercredi 22 septembre 2010
Statut
Membre
Dernière intervention
8 janvier 2014
3
Une omission dans le code précédent, il faut revenir à un mois effectif ($mo compris entre 1 et 12 avec correction de l'année) avant de construire le tableau.
Insérer alors la ligne suivante après la définition de $jo ou de $jz :
$an=date('Y',$jo);$mo=date('n',$jo);
Messages postés
276
Date d'inscription
mercredi 22 septembre 2010
Statut
Membre
Dernière intervention
8 janvier 2014
3
Les plus paresseux sont les meilleurs en programmation, avec quelques boucles et cogitations ils évitent bien des répétitions !

Voici une variante commentée en moins de 50 lignes (et 2Ko au lieu de 27).

<style>
td {font-size:11px;vertical-align:middle;text-align:center;background:#b9b9b9;font-weight:900;color:#fff;}
td a {text-decoration:none;color:#fff;font-weight:900;}
</style>
<?php
// sortir les accents en précisant le charset
header("Content-Type: text/html; charset=utf-8");
// Initialisation et nom du fichier qui pourra être renommé sans autre intervention
$ms=explode('|','Janvier|Février|Mars|Avril|Mai|Juin|Juillet|Août|Septembre|Octobre|Novembre|Décembre');
$slf=basename($_SERVER['PHP_SELF']);

// Les années, mois et jours d'ouverture de la page
$an=date('Y');$mo=date('n');$jr=date('j');

// à modifier si nécessaire
if (!empty($_GET) && isset($_GET["a"])&& isset($_GET["m"])) {
$an=$_GET["a"];$mo=$_GET["m"];}

// le premier jour du mois et la colonne correspondante (à partir de 0 pour le lundi)
$jo=mktime(0,0,0,$mo,1,$an);$co=(date('w',$jo)+6)%7;
// le dernier jour du mois et la durée du mois
$jz=mktime(0,0,0,$mo+1,0,$an);$dm=date('j',$jz);

// Construire le tableau
$chnCal='';
$chnCal.='----
["'.$slf.'?a='.$an.'&m='.($mo-1).'"><<, ';
$chnCal.=''.$ms[$mo-1].' '.$an.', ';
$chnCal.='>], ';
$chnCal.='----
';
for ($cl=0;$cl<7;$cl++){$chnCal.=''.substr("LuMaMeJeVeSaDi",2*$cl,2).', ';}
$chnCal.='';
// Initialiser le quantième du mois qui doit prendre la valeur 1 dans la colonne $co
$qm=1-$co;
for ($lg=2;$lg<8;$lg++) {
$chnCal.='----
';
for ($cl=0;$cl<7;$cl++){
// Afficher les seuls quantièmes du mois
if ($qm<1 || $dm<$qm) $chnCal.=', ';
else $chnCal.=''.$qm.', ';
// incrementer le quantième
$qm++;}
$chnCal.='';}
$chnCal.='
';
// Afficher le tableau
echo $chnCal;
?>

Inutile d'aller chercher des classes et complications quant la durée d'un mois est déterminée par le quantième de son dernier jour qui est aussi, en PHP, le jour 0 du mois suivant (voir la ligne 22).

Enfin, pourquoi faire appel au serveur pour afficher un tel calendrier, de tels scripts auraient, semble-t-il, meilleure place à la rubrique javascript. Le nombre de jour du mois mo de l'année an serait alors obtenu par la simple différence 32 - new Date(an,mo,32).getDate() !

Alors bon courage pour la transcription avec de belles boucles sur nos drôles de machines...
Messages postés
4
Date d'inscription
samedi 6 janvier 2007
Statut
Membre
Dernière intervention
25 février 2009

Bonjour,

PHP est aujourd'hui très complet au niveau des fonctions pour calculer et afficher un calendrier. (cf PHP Manual -> http://fr2.php.net/manual/fr/book.calendar.php) J'ai pas regardé en détail le code mais je pense qu'il est possible de faire le même en moins de 200 lignes (peut être même moins de 100 lignes.

Pour aider un peu, voici ma classe calendrier en PHP5:
http://www.phpcs.com/codes/CLASSE-CALENDRIER_49347.aspx

Bon courage.
Messages postés
25
Date d'inscription
lundi 10 décembre 2007
Statut
Membre
Dernière intervention
29 juin 2010

Merci énormément pour votre aide, en fait je me remet maintenant sur ce calendrier et d'ici un jour ou deux je posterai quelque chose de plus simple et biensur qui soit meilleur.

ps: je connaissais pas la fonction cal_days_in_month(CAL_GREGORIAN, date("n"), date("Y")) mais maintenant je pense qu'elle aidera beaucoup
Afficher les 6 commentaires