script d'un calendrier

Eléphant du PHP | 148 Messages

03 sept. 2007, 15:37

Bonjour,

je reviens vers vous avec un titre un peu plus explicite.

Je voudrais générer dynamiquement, et sur une seule ligne les numéros des jours d'un mois, et sur un mois.
Je voudrais en plus colorer les samedi et dimanche.

Voici où j'en, suis :
// début calendrier
$date=date('D/d/m/Y');
list($dcourt,$day, $month, $year) = explode("/", $date);

$joursem = array('dim', 'lun', 'mar', 'mer', 'jeu', 'ven', 'sam');
$mois=array('','Janvier','Février','Mars','Avril','Mai','Juin','Juillet','Août','Septembre','Octobre','Novembre','Décembre');
// calcul du timestamp
$timestamp = mktime (0, 0, 0, $month, 01, $year);

//echo $joursem[date("w",$timestamp)];

// nombre de jours du mois
$nombreDeJours = intval(date("t",$month));
//echo $nombreDeJours;
$i=1;
$month_t=intval(date("n"));
// affichage du mois par son nom
echo "<p>Planning du mois de ".$mois[$month_t]."</p>";
// début d'entrée des dates.

while ($i<=$nombreDeJours)
{
$l=$year."-".$month."-".$i;

list($a, $m, $d) = sscanf($l, "%d-%d-%d"); //%d pour récupérer des entiers mais on peut utiliser 
//%s pour récupérer comme des chaînes de caractères
echo $joursem[$d].$l."<br>";
$i=$i+1;
}
Pour l'instant, ce code ne fonctionne pas, les jours ne correspondent pas aux dates, et ne s'appliquent qu'une fois. Voici ce que j'obtiens :
Planning du mois de Septembre
lun2007-09-1
mar2007-09-2
mer2007-09-3
jeu2007-09-4
ven2007-09-5
sam2007-09-6
2007-09-7
2007-09-8
2007-09-9
2007-09-10
2007-09-11
2007-09-12
2007-09-13
2007-09-14
2007-09-15
2007-09-16
2007-09-17
2007-09-18
2007-09-19
2007-09-20
2007-09-21
2007-09-22
2007-09-23
2007-09-24
2007-09-25
2007-09-26
2007-09-27
2007-09-28
2007-09-29
2007-09-30
2007-09-31
Je galère depuis quelques jours, et je suis preneur de toute bonne idée !

Merci d'avance
Et hop !

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9782 Messages

03 sept. 2007, 17:13

Bonjour,

A mon avis le + simple est que tu mette ton mktime() dans la boucle while et que tu incrémente d'1 unitél'argument jour de mktime :)
Quand tout le reste a échoué, lisez le mode d'emploi...

Eléphant du PHP | 148 Messages

04 sept. 2007, 09:34

Salut !

Merci pour l'indice !

Voici le code revu, cela semble-t-il bon ? Les résultats affichés sont cohérants, mais peut-être suis-je passé à côté de quelque chose ?

<edit> En fait, il y a un soucis avec le calcul du nombre de jours dans le mois, car pour le mois de février ( $month = 2; ) j'ai 31 jours... et même en faisant un effort les années bisextiles... ça le fait pas !
Où est mon erreur ?
</edit>
<table width="95%" border="0">
  <tr>
  	<td>&nbsp;</td>
<?php
// début calendrier
$date=date('D/d/m/Y');
list($dcourt,$day, $month, $year) = explode("/", $date);
$month = 10; // test
$joursem = array('dim', 'lun', 'mar', 'mer', 'jeu', 'ven', 'sam');
$mois=array('','Janvier','Février','Mars','Avril','Mai','Juin','Juillet','Août','Septembre','Octobre','Novembre','Décembre');



// nombre de jours du mois
$nombreDeJours =  date("t",mktime(0,0,0,$month,$year)); 
// initialisation du compteur              
$i=1;
//$month_t=intval(date("n"));
$month_t=$mois[$month];
// affichage du mois par son nom
echo "<p>Planning du mois de ".$month_t." ".$year."</p>";
// début d'entrée des dates.

while ($i<=$nombreDeJours)
{

	// calcul du timestamp
	$timestamp = mktime (0, 0, 0, $month, $i, $year);
	
	$l=$year."-".$month."-".$i;
	
	list($a, $m, $d) = sscanf($l, "%d-%d-%d"); //%d pour récupérer des entiers mais on peut utiliser 
	
	// jour en français
	$vrai_jour = $joursem[date("w",$timestamp)];
	
	// Gestion du style
	if (($vrai_jour == "sam") || ($vrai_jour == "dim")) {
		$style = "red";
		}
	else {
		$style = "normal";
	}
	
	// affichage
	echo "<td><span class=\"".$style."\">".$vrai_jour." ".$i."</span></td>";
	$i=$i+1;
}

//fermeture de la ligne
echo "</tr>";
?>
	<tr>
		<td width="9%">8h30 - 13h30</td>
	</tr>
	<tr>
		<td width="9%">13h30 - 18h30</td>
	</tr>
	<tr>
		<td width="9%">18h30 - 8h30</td>
	</tr>
</table>
Encore merci ! :wink:

<edit2> Bon, j'ai trouvé, il fallait rajouter +1 après la variable $month dans le mktime(). Je mets résolu !

@ +
</edit2>
Et hop !