CALENDRIER

beschtraffer Messages postés 16 Date d'inscription dimanche 11 mars 2007 Statut Membre Dernière intervention 22 mai 2014 - 10 janv. 2011 à 08:11
007Julien Messages postés 276 Date d'inscription mercredi 22 septembre 2010 Statut Membre Dernière intervention 8 janvier 2014 - 4 févr. 2011 à 16:04
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

007Julien Messages postés 276 Date d'inscription mercredi 22 septembre 2010 Statut Membre Dernière intervention 8 janvier 2014 4
4 févr. 2011 à 16:04
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);
007Julien Messages postés 276 Date d'inscription mercredi 22 septembre 2010 Statut Membre Dernière intervention 8 janvier 2014 4
4 févr. 2011 à 15:27
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...
Mister Jingles Messages postés 4 Date d'inscription samedi 6 janvier 2007 Statut Membre Dernière intervention 25 février 2009
18 janv. 2011 à 12:28
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.
cs_gabay Messages postés 25 Date d'inscription lundi 10 décembre 2007 Statut Membre Dernière intervention 29 juin 2010
12 janv. 2011 à 01:39
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
cs_catlord Messages postés 3 Date d'inscription mardi 13 janvier 2009 Statut Membre Dernière intervention 20 mai 2010
10 janv. 2011 à 19:56
Quand deux lignes de code se ressemblent en PHP, quelque chose ne va pas... Le script est bcp trop long et il doit être normalement possible d'afficher un calendrier perpétuel en quelques lignes.
beschtraffer Messages postés 16 Date d'inscription dimanche 11 mars 2007 Statut Membre Dernière intervention 22 mai 2014 23
10 janv. 2011 à 08:11
Bonjour,

Déjà je trouve que ce calendrier est joli, et qu'il faut du courage pour écrire 1000 lignes de code ;)

Je suis moi même en train de coder un calendrier, et j'ai une ou deux idées pour vous aider à raccourcir un peu le code.

Il existe une fonction en php: cal_days_in_month(CAL_GREGORIAN, date("n"), date("Y")) qui permet d'obtenir le nombre de jours dans le mois (à partir du mois et de l'année). Ce qui est bien pratique.

Personnellement, pour faire le calendrier, j'ai fait un tableau que j'ai rempli en une seule boucle. Si le compteur de la boucle était inférieur à 'date("w",mktime ( 0,0,0,$mois ,1,$annee))', le tableau est vide, sinon je mets la valeur du compteur (+ le décalage de la valeur du premier jour) jusqu'à la valeur du nombre de jours dans le mois.

Du coup le code ne fait que 30 lignes. Bon, étant débutant, ce n'est pas forcément la méthode idéale que je propose... Mais si ça peut faire gagner quelques lignes

Pour ce qui est de l'optimisation du code lui-même, lorsque vous mettez 'else if', vous pouvez plutôt écrire 'elseif' ça permet de ne créer qu'un boucle conditionnelle (comme un switch...case) au lieu de boucles if...else imbriquées. Ce serait un tantinet plus rapide.

J'espère avoir pu aider, et dès que j'en aurai fini avec mon calendrier, je posterai la source, ce sera plus clair que mon explication...

En espérant que vous aurez quelques commentaires de vrais "experts", ça m'intéresse aussi

Bonne journée!
Rejoignez-nous