Calendrier en PHP

Résolu/Fermé
Fetide68 Messages postés 738 Date d'inscription dimanche 4 janvier 2009 Statut Membre Dernière intervention 26 avril 2024 - 25 janv. 2010 à 09:37
Fetide68 Messages postés 738 Date d'inscription dimanche 4 janvier 2009 Statut Membre Dernière intervention 26 avril 2024 - 27 janv. 2010 à 18:29
Bonjour,

J'essaie de faire tout seul un calendrier en PHP !

Un seul détail ne fonctionne pas, chaque mois commence un lundi comme ceci pour janvier:

L M M J V S D
1 2 3
4 5 6 7 8 9 10...

Le 4 est bien un lundi mais le premier, est un vendredi... J'essaie de trouver une condition pour afficher '<td> </td>' si le jour ne correspond pas mais je ne vois pas... :

Voici mon code :
<span class="location">
	<form method="post" id="dates">
		<select name="mois" id="mois" onchange="document.getElementById('dates').submit();">
			<?php 
				$mois = array ('','Janvier','F&eacute;vrier','Mars','Avril','Mai','Juin','Juillet','Ao&ucirc;t','Septembre','Octobre','Novembre','D&eacute;cembre');
				$jours = array ('Dimanche','Lundi','Mardi','Mercredi','Jeudi','Vendredi','Samedi');
				
				$selected_month = Securite::bdd($_POST['mois']);
				
				for ($mm=1;$mm<=12;$mm++) {
					if ($mm != $selected_month) {
						echo '<option value="'.$mm.'">'.$mois[$mm].'</option>';
					}
					else {
						echo '<option value="'.$mm.'" selected>'.$mois[$mm].'</option>';
					}
				}
			?>
		</select>
		<select name="annee" id="annee" onchange="document.getElementById('dates_foyer').submit();">
			<?php 
				$annee_courante = date('Y',time());
				$annee_suivante = date('Y',time())+1;
				
				$selected_year = Securite::bdd($_POST['annee']);
				
				if ($selected_year == $annee_suivante) {
					echo '<option value="'.$annee_courante.'">'.$annee_courante.'</option>';
					echo '<option value="'.$annee_suivante.'" selected>'.$annee_suivante.'</option>';
				}
				else {
					$selected_year = date('Y',time());
					echo '<option value="'.$annee_courante.'" selected>'.$annee_courante.'</option>';
					echo '<option value="'.$annee_suivante.'">'.$annee_suivante.'</option>';
				}
			?>
		</select>
	</form>
</span>
<?php
		if ($selected_month != '' && $selected_year != '') {
			$month = $selected_month;
			$year = $selected_year;
			echo $mois[$month].' '.$year;
		}
		else {
			$month = date ('n',time());
			$year = date ('Y',time());
			echo $mois[$month].' '.$year;
		}

		// date choisie en timestamp
		$selected_date = strtotime('01-'.$month.'-'.$year);
		// nombre de jour pour le mois et de l'année choisie
		$nombre_de_jour = date ('t',$selected_date);

		echo '<br><br>';
		
		
		echo '<br><br>';
		
		echo '<table class="calendrier" style="margin: auto; width: 420px;">';
		echo '<tr class="entete"><td>L</td><td>M</td><td>M</td><td>J</td><td>V</td><td class="weekend">S</td><td class="weekend">D</td></tr>';
			for ($day=1; $day<=$nombre_de_jour; $day++) {
				$date_du_day = strtotime($day.'-'.$month.'-'.$year);
				
				$jours_semaine = Array("0", "1", "2", "3", "4", "5", "6", "0");
				
				$jour_de_la_semaine = date('w',$date_du_day);
				
				if ($jour_de_la_semaine==1) {
					echo '<tr>';
				}

				echo '<td>'.$day.'</td>'; 

				if ($jour_de_la_semaine==0) {
					echo '</tr>';
				}
			
			}
		echo '</table>';
?>


Merci !
A voir également:

10 réponses

TiboleParano Messages postés 498 Date d'inscription mardi 18 mars 2008 Statut Membre Dernière intervention 7 avril 2015 61
25 janv. 2010 à 10:43
d'abord je pensais me rappeler que dans les listes déroulantes, l'attribut par défaut se notait selected="selected"
ensuite dans $jour[] je vois que dimanche est en première position alors qu'il est affiché en dernier

Sinon plus concretement pour ton problème de décalage, je vais donner mon avis perso:
t'as déjà réussi un joli coup: il t'écris pas toute la semaine entière, donc quand tu lui demandes un nouveau mois, tu dois le faire se décaler de n cases ... je vois sa ainsi:
echo '<table class="calendrier" style="margin: auto; width: 420px;">';
		echo '<tr class="entete"><td>L</td><td>M</td><td>M</td><td>J</td><td>V</td><td class="weekend">S</td><td class="weekend">D</td></tr>';

XXXXX
$initiation_mois = strtotime('01-'.$month.'-'.$year);
$jour_de_la_semaine = date('w',$date_du_day);
$j="";
for($i=1; $i<=date('N',$jour_de_la_semaine);$i++) $j= $j."<td/>"
XXXXXXX

for ($day=2; $day<=$nombre_de_jour; $day++) {
				$date_du_day = strtotime($day.'-'.$month.'-'.$year);
				
				$jours_semaine = Array("0", "1", "2", "3", "4", "5", "6", "0");
				
				$jour_de_la_semaine = date('w',$date_du_day);
				
				if ($jour_de_la_semaine==1) {
					echo '<tr>';
				}

				echo '<td>'.$day.'</td>'; 

				if ($jour_de_la_semaine==0) {
					echo '</tr>';


Voilà ce que j'en penses. J'ai rajouté le code entre les "XXX" qui permet d'ajouter autant de "<td/>" (saut de case) que de jours déjà passés dans la semaine, et je modifie la boucle juste après pour qu'elle commence au 2e jour
0
Fetide68 Messages postés 738 Date d'inscription dimanche 4 janvier 2009 Statut Membre Dernière intervention 26 avril 2024 32
25 janv. 2010 à 11:17
Je comprends un peu ton code que j'ai adapté pour l'insérer au bon endroit (brut, il ne fonctionne pas bien: ça me met tout en ligne):

Juste avant echo '<td>'.$day.'</td>' j'ai fait ça :

for ($i=1; $i<=date('N',$jour_de_la_semaine);$i++) echo "<td/>";


Mais ca me décale tout le tableau. Toutes les semaines un vendredi tous les mois...
0
TiboleParano Messages postés 498 Date d'inscription mardi 18 mars 2008 Statut Membre Dernière intervention 7 avril 2015 61
25 janv. 2010 à 11:35
non non je pense qu'on s'est mal compris: mon bout de code détermine quel est le 1er jour du mois sous forme numérique (lundi = 1; mardi = 2; ...) et passes autant de cases grace à <td/> (qui remplace une case vide <td></td>) mais cela doit etre fait une seule fois, avant la génération du calendrier complet (hors boucle for)
0
TiboleParano Messages postés 498 Date d'inscription mardi 18 mars 2008 Statut Membre Dernière intervention 7 avril 2015 61
25 janv. 2010 à 11:41
Oups, haaaa ! je me suis planté dans mon code et en effet je t'ai filé un truc qui ... fait rien du tout, alors jai fait une petite boucle for qui stocke une chaine dans $j sans l'utiliser, hop hop hop sa ne va pas, voilà en effet ce que j'aurais du mettre:

XXXXX
$initiation_mois = strtotime('01-'.$month.'-'.$year);
$jour_de_la_semaine = date('w',$date_du_day);
$j="";
for($i=1; $i<=date('N',$jour_de_la_semaine);$i++) echo "<td/>";
XXXXXXX
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Fetide68 Messages postés 738 Date d'inscription dimanche 4 janvier 2009 Statut Membre Dernière intervention 26 avril 2024 32
25 janv. 2010 à 11:56
C'est pareil, ça place tout sur le vendredi...
0
Fetide68 Messages postés 738 Date d'inscription dimanche 4 janvier 2009 Statut Membre Dernière intervention 26 avril 2024 32
25 janv. 2010 à 15:04
J'aurais cru cela simple pour les ccmiens ! Ce forum est-il en perdition de bons webmaster ?
0
Fetide68 Messages postés 738 Date d'inscription dimanche 4 janvier 2009 Statut Membre Dernière intervention 26 avril 2024 32
26 janv. 2010 à 09:32
Hello ?
0
Fetide68 Messages postés 738 Date d'inscription dimanche 4 janvier 2009 Statut Membre Dernière intervention 26 avril 2024 32
27 janv. 2010 à 10:15
0
TiboleParano Messages postés 498 Date d'inscription mardi 18 mars 2008 Statut Membre Dernière intervention 7 avril 2015 61
27 janv. 2010 à 15:52
dsl pas dispo le weekend, content que t'ai trouvé la solution, bien joué
Bonne continuation
0
Fetide68 Messages postés 738 Date d'inscription dimanche 4 janvier 2009 Statut Membre Dernière intervention 26 avril 2024 32
27 janv. 2010 à 18:29
Merci !
0