Automatiser un calendrier statique

Résolu/Fermé
YameFAZE Messages postés 201 Date d'inscription mardi 24 avril 2012 Statut Membre Dernière intervention 14 mars 2021 - 3 mars 2019 à 09:44
YameFAZE Messages postés 201 Date d'inscription mardi 24 avril 2012 Statut Membre Dernière intervention 14 mars 2021 - 3 mars 2019 à 17:49
Bonjour,

Grâce à un tuto j'ai pu réaliser un petit calendrier statique. Ce que j'aimerais c'est pouvoir le rendre dynamique pour éviter d'avoir à ré-écrire le calendrier sur chaque mois de chaque année.

Actuellement mon calendrier ajoute automatiquement le nombre de cellules nécessaires pour écrire les 31 jours du mois mais le calendrier sait qu'il y a 31 jours parce que c'est moi qui lui ait dit. Ce que j'aimerais c'est que le calendrier soit capable de se dire automatiquement "en février 2019 il y a 28 jours donc si l'utilisateur affiche février 2019 j'ajoute 28 cellules dans le calendrier". Et qu'il soit aussi capable de savoir à quel jour du mois commence le 1er parce que actuellement le 1er commence automatiquement le lundi. Et dernière chose, comment faire pour que si le 1er commence un mardi, la calendrier ajoute automatiquement une cellule vide le lundi.

Actuellement mon calendrier utilise une méthode qui calcule le nombre d'entrées dans un array pour savoir combien de cellules il doit ajouter. Au début pour automatiser la récupération du nombre de jours dans un mois donné je me suis dit que j'allais utiliser cal_days_in_month, sauf que le problème c'est que cette méthode renvoie un nombre entier, donc ma méthode qui s'appuie sur le nombre d'entrées dans mon array n'est plus valable. Sauf si je trouve un moyen d'adapter ma méthode au résultat renvoyé par cal_days_in_month. Mais même là l'automatisation ne serait finalement pas complète puisqu'il faudrait que je dise manuellement pour chaque mois au calendrier "récupère le nombre de jours pour ce mois-ci". Y a-t-il une manière d'automatiser tout cela ?

<!-------------------->
<!------- PARC ------->
<!-------------------->
<?php
/* On déclare les variables */
$jour = date('l');
$liste_jours = array(
1 => 'Lundi',
2 => 'Mardi',
3 => 'Mercredi',
4 => 'Jeudi',
5 => 'Vendredi',
6 => 'Samedi',
7 => 'Dimanche'
);
$numero = date('j');
$liste_numeros = array(
1 => '1',
2 => '2',
3 => '3',
4 => '4',
5 => '5',
6 => '6',
7 => '7',
8 => '8',
9 => '9',
10 => '10',
11 => '11',
12 => '12',
13 => '13',
14 => '14',
15 => '15',
16 => '16',
17 => '17',
18 => '18',
19 => '19',
20 => '20',
21 => '21',
22 => '22',
23 => '23',
24 => '24',
25 => '25',
26 => '26',
27 => '27',
28 => '28',
29 => '29',
30 => '30',
31 => '31',
''
);
$mois = date('F');
$liste_mois = array(
1 => 'Janvier',
2 => 'Février',
3 => 'Mars',
4 => 'Avril',
5 => 'Mai',
6 => 'Juin',
7 => 'Juillet',
8 => 'Août',
9 => 'Septembre',
10 => 'Octobre',
11 => 'Novembre',
12 => 'Décembre'
);
$annee = date('Y');
/* Nombre de colones du calendrier */
$nbr_col = 7;
/* Calculateur du nombre de cellules à remplir en fonction de la variable $liste_numeros */
$calcul_cel = count($liste_numeros);
/* Calcul du nombre de lignes nécessaires au calendrier */
if (round($calcul_cel/$nbr_col) != ($calcul_cel/$nbr_col)) {
$nbr_lig = round(($calcul_cel/$nbr_col)+0.5);
} else {
$nbr_lig = $calcul_cel/$nbr_col;
}
/* On déclare le format français pour convertir les jours et les mois en français */
setlocale(
LC_ALL,
'fr_FR.UTF8',
'fr_FR',
'fr',
'fra',
'fr_FR@euro'
);
?>
<script type="text/javascript" src="js/parc.js"></script>
<div id="parc" class="article">
<h2 id="titre_article">Les motos disponibles</h2>
<ul>
<li id="conteneur_miniatures">
<a href="#" id="1" onclick="function(afficherMoto);"><img src="images/miniatures/moto_1.jpg" alt="Kawasaki Z1000" class="bouton" /></a>
</li>
<li id="conteneur_fiche_moto" class="perspective"></li>
</ul>
<?php
/* On affiche la date en convertissant les jours et les mois en français */
echo "Aujourd'hui nous sommes le ".strftime('%A', strtotime($jour))." ".$numero." ".strftime('%B', strtotime($mois))." ".$annee.".";
?>
<ul>
<li id="conteneur_calendrier">
<?php
if ($calcul_cel != 1) {
/* Indice du calendrier */
$k = 1;
?>
<table border="1" style="background-color: yellow;">
<tbody>
<tr style="background-color: green;">
<!-- Affichage des jours de la semaine -->
<td><?php echo $liste_jours[1]; ?></td>
<td><?php echo $liste_jours[2]; ?></td>
<td><?php echo $liste_jours[3]; ?></td>
<td><?php echo $liste_jours[4]; ?></td>
<td><?php echo $liste_jours[5]; ?></td>
<td><?php echo $liste_jours[6]; ?></td>
<td><?php echo $liste_jours[7]; ?></td>
</tr>
<?php
for ($i = 1; $i <= $nbr_lig; $i++) { /* Ligne $i */
?>
<tr>
<?php
for ($j = 1; $j <= $nbr_col; $j++) { /* Colonne $j */
if ($k < $calcul_cel) {
?>
<td style="background-color: orange;">
<?php
/* Données à afficher dans les cellules */
echo $liste_numeros[$k];
?>
</td>
<?php
$k++;
} else { /* Cellule vide */
?>
<td style="background-color: red;"> </td>
<?php }} ?>
</tr>
<?php } ?>
</tbody>
</table>
<?php
} else {
?>
<?php } ?>
</li>
</ul>
</div>


Merci d'avance.

Configuration: Ordinateur portable ASUS UX21E
Windows 7
A voir également:

3 réponses

yg_be Messages postés 22724 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 25 avril 2024 1 476
Modifié le 3 mars 2019 à 10:39
bonjour, je pense que tu es sur la bonne piste:
- cal_days_in_month te donne le nombre de jours du mois
- tu peux utiliser
date('N', strtotime('first day of this month') )
pour déterminer le jour de la semaine du premier jour du mois. Cela te permettra de déterminer le nombre de cases vides à ajouter au début.

ensuite, pour remplir ton tableau, je pense qu'il est plus simple, au lieu des deux boucles en i et j, de faire une seule boucle sur k (les jours), et de modifier i (le numéro de ligne) et j (le numéro de colonne) au fur et à mesure.
0
jordane45 Messages postés 38145 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 25 avril 2024 4 650
3 mars 2019 à 10:46
Bonjour,

Au lieu d'écrire à la main un array avec les "jours" du mois, tu peux le générer via une boucle allant de 1 jusqu'au dernier jour du mois.
Pour trouver ce jour...https://www.commentcamarche.net/faq/875-php-dernier-jour-du-mois-nombre-de-jours-dans-le-mois

Je te conseille également d'utiliser l'objet DateTime de php pour manipuler les dates.
Par exemple
 $dateDeb = new DateTime('2006-01-01');  
  $dateFin = new DateTime();
 
  $date = '';  
  while ($dateDeb -> format('Y-m-d') <= $dateFin -> format('Y-m-d'))
  {
    echo "<br>".$dateDeb -> format('Y-m-d') . "\n";
    $dateDeb -> modify('+1 day');
  }


Mais allons plus loin...
Pour ensuite pouvoir utiliser facilement les informations il faudrait pouvoir créer un "nouvel array" qui classerait les dates par semaine et qui t'indique le 'jour de la semaine' de chaque date...
Donc.. essaye ça :
$annee = 2019;
$mois = 2;

$dateDeb = new DateTime($annee.'-'.$mois.'-01');  //premier jour du mois
$dateFin = new DateTime($dateDeb->format( 'Y-m-t' )); //dernier jour du mois
 
$arrDates = array();
  while ($dateDeb -> format('Y-m-d') <= $dateFin -> format('Y-m-d'))
  {
    $semaine = $dateDeb->format('W'); //numéro de semaine
    $jour = $dateDeb->format('N'); // numéro du jour
    $arrDates[$semaine][$jour] = $dateDeb -> format('Y-m-d') . "\n"; //on stocke la date dans l'array
    $dateDeb -> modify('+1 day'); // on incrémente la date pour continuer la boucle
  }
  
  
  echo "<pre>";
  print_r($arrDates);
  echo "</pre>";

0
jordane45 Messages postés 38145 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 25 avril 2024 4 650
3 mars 2019 à 10:46
NB: A l'avenir, merci d'utiliser correctement les balises de code afin d'avoir, comme pour mon code, la coloration syntaxique.
Explications disponibles ici : https://codes-sources.commentcamarche.net/faq/11288-les-balises-de-code
0
YameFAZE Messages postés 201 Date d'inscription mardi 24 avril 2012 Statut Membre Dernière intervention 14 mars 2021
3 mars 2019 à 16:02
Merci pour vos réponses. Je sens que je touche au but concernant la boucle qui me permettrait d'obtenir automatiquement le nombre de jours du mois en cours mais je bloque sur comment intégrer le résultat de la boucle dans l'array.

<!-------------------->
<!------- PARC ------->
<!-------------------->
<?php
	/* On déclare la $ qui retourne le jour en cours */
	$jour = date('l');
	/* On déclare la $ qui contient la liste des jours */
	$liste_jours = array(
		1 => 'Lundi',
		2 => 'Mardi',
		3 => 'Mercredi',
		4 => 'Jeudi',
		5 => 'Vendredi',
		6 => 'Samedi',
		7 => 'Dimanche'
	);
	/* On déclare la $ qui retourne le mois en cours */
	$mois = date('F');
	/* On déclare la $ qui retourne l'année en cours */
	$annee = date('Y');
	/* On déclare la $ qui retourne le 1er jour du mois en cours */
	$premier_jour = date($annee.'-'.date('n').'-01');
	/* On déclare la $ qui retourne le nombre de jours du mois en cours */
	$nombre_jours = cal_days_in_month(CAL_GREGORIAN, date('n'), $annee);
	/* On déclare la $ qui va comporter le nombre de numéros de jours du mois en cours */
	$liste_numeros = array();
	/* On déclare une boucle qui va incrémenter de 1 à partir du 1er jour jusqu'à atteindre le nombre de jours maximum du mois en cours puis qui va introduire le résultat dans la $liste_numero */
	while ($premier_jour <= $nombre_jours) {
		$premier_jour++;
	}
	/* Nombre de colonnes du calendrier */
	$nombre_colonnes = 7;
	/* Calcul du nombre de lignes nécessaires au calendrier pour pouvoir afficher tous les numéros des jours du mois demandé dans la variable $nombre_jours */
	if (round($nombre_jours/$nombre_colonnes) != ($nombre_jours/$nombre_colonnes)) {
		$nombre_lignes = round(($nombre_jours/$nombre_colonnes)+0.5);
	} else {
		$nombre_lignes = $nombre_jours/$nombre_colonnes;
	}
	/* On déclare le format français pour convertir les jours et les mois en français */
	setlocale(
		LC_ALL,
		'fr_FR.UTF8',
		'fr_FR',
		'fr',
		'fra',
		'fr_FR@euro'
	);
?>
	<ul>
		<li id="conteneur_calendrier">
			<?php
				if ($nombre_jours != 0) {
					/* Indice du calendrier par lequel doit commencer l'affichage des numéros des jours */
					$k = 1;
			?>
			<table border="1">
				<tbody>
					<tr>
						<!-- Affichage des jours de la semaine -->
						<td><?php echo $liste_jours[1]; ?></td>
						<td><?php echo $liste_jours[2]; ?></td>
						<td><?php echo $liste_jours[3]; ?></td>
						<td><?php echo $liste_jours[4]; ?></td>
						<td><?php echo $liste_jours[5]; ?></td>
						<td><?php echo $liste_jours[6]; ?></td>
						<td><?php echo $liste_jours[7]; ?></td>
					</tr>
					<?php
						for ($i = 1; $i <= $nombre_lignes; $i++) { /* Ligne $i */
					?>
					<tr>
						<?php
							for ($j = 1; $j <= $nombre_colonnes; $j++) { /* Colonne $j */
								if ($k < $nombre_jours) {
						?>
						<td>
							<?php
								/* Données de la variable $liste_numeros à afficher dans les cellules */
								echo $liste_numeros[$k];
							?>
						</td>
						<!-- Cellule vide -->
						<?php $k++; } else { ?><td> </td><?php }} ?>
					</tr>
					<?php } ?>
				</tbody>
			</table>
			<?php } else {} ?>
		</li>
	</ul>
0
jordane45 Messages postés 38145 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 25 avril 2024 4 650
Modifié le 3 mars 2019 à 16:21
<?php



$annee = 2019;
$mois = 2;

$liste_jours = array(
  1 => 'Lundi',
  2 => 'Mardi',
  3 => 'Mercredi',
  4 => 'Jeudi',
  5 => 'Vendredi',
  6 => 'Samedi',
  7 => 'Dimanche'
 );

$dateDeb = new DateTime($annee.'-'.$mois.'-01');  //premier jour du mois
$dateFin = new DateTime($dateDeb->format( 'Y-m-t' )); //dernier jour du mois
 
$arrDates = array();
$arrSemaines = array();
  while ($dateDeb -> format('Y-m-d') <= $dateFin -> format('Y-m-d'))
  {
    $semaine = $dateDeb->format('W');
    $jour = $dateDeb->format('N');
    $arrDates [$semaine][$jour] = $dateDeb -> format('d/m/Y');
    $arrSemaines[] = $semaine;
    $dateDeb -> modify('+1 day');
    
  }
  ?>
  <table border="1">
    <thead>
     <tr>
      <!-- Affichage des jours de la semaine -->
            <?php
              foreach($liste_jours as $J){
                echo "<th>".$J."</th>";
              }
            ?>
     </tr>
    
          </thead>
          <tbody>
          <tr>
          <?php
          foreach($arrSemaines as $S){
            echo "<tr>";

            for ($i = 1; $i <= 7; $i++) { 
              if(!empty($arrDates[$S][$i])){
                  echo "<td>".$arrDates[$S][$i]."</td>";
              }else{
                  echo "<td></td>";
              }
            }
            echo "</tr>";
          }
      
     ?>
     </tr>
    </tbody>
   </table>
  
0
YameFAZE Messages postés 201 Date d'inscription mardi 24 avril 2012 Statut Membre Dernière intervention 14 mars 2021 > jordane45 Messages postés 38145 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 25 avril 2024
Modifié le 3 mars 2019 à 17:14
Merci Jordane mais ton code ne fonctionne pas correctement... ci-dessous une capture d'écran. Ce que je voudrais dans les cellules c'est juste le numéro du jour et pas la date complète. Et je ne comprends pas ces 3 premières lignes vides ainsi que le fait que les cellules soient remplies que sur une seule colonne. Je suis reparti de zéro à partir de ton code.



<!-------------------->
<!------- PARC ------->
<!-------------------->
<?php
 /* On déclare la $ qui contient la liste des jours */
 $liste_jours = array(
  1 => 'Lundi',
  2 => 'Mardi',
  3 => 'Mercredi',
  4 => 'Jeudi',
  5 => 'Vendredi',
  6 => 'Samedi',
  7 => 'Dimanche'
 );
 /* On déclare la $ qui retourne l'année en cours */
 $annee = date('Y');

 $premier_jour = new DateTime($annee.'-'.date('n').'-01');
 $dernier_jour = new DateTime($premier_jour->format('Y-m-t'));

 $liste_numeros = array();
 $liste_semaines = array();

 while ($premier_jour->format('Y-m-d') <= $dernier_jour->format('Y-m-d')) {
  $semaine = $premier_jour->format('W');
  $jour = $premier_jour->format('N');
  $liste_numeros[$semaine][$jour] = $premier_jour->format('d/m/Y');
  $liste_semaines[] = $semaine;
  $premier_jour -> modify('+1 day');
 }

 /* On déclare le format français pour convertir les jours et les mois en français */
 setlocale(
  LC_ALL,
  'fr_FR.UTF8',
  'fr_FR',
  'fr',
  'fra',
  'fr_FR@euro'
 );
?>
 <ul>
  <li id="conteneur_calendrier">
   <table border="1">
    <thead>
     <tr>
      <!-- Affichage des jours de la semaine -->
      <?php
       foreach ($liste_jours as $j) {
        echo "<th>".$j."</th>";
       }
      ?>
     </tr>
    </thead>
    <tbody>
     <tr>
      <?php
       foreach ($liste_semaines as $s) {
        echo "<tr>";
        for ($i = 1; $i <= 7; $i++) {
         if (!empty($liste_semaines[$s][$i])) {
          echo "<td>".$liste_numeros[$s][$i]."</td>";
         } else {
          echo "<td></td>";
         }
        }
        echo "</tr>";
       }
      ?>
     </tr>
    </tbody>
   </table>
  </li>
 </ul>
0
jordane45 Messages postés 38145 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 25 avril 2024 4 650
Modifié le 3 mars 2019 à 17:18
Le code fonctionne parfaitement...
ce n'est pas de ma faute si tu n'es pas capable de faire des copier/coller et que tu préfères renommer les variables à ta sauce...
Donc si on reprend le code qui fonctionne....réadapté à ta façon....
<table border="1">
    <thead>
     <tr>
      <!-- Affichage des jours de la semaine -->
            <?php
              foreach($liste_jours as $J){
                echo "<th>".$J."</th>";
              }
            ?>
     </tr>
    
          </thead>
          <tbody>
          <tr>
          <?php
          foreach($liste_semaines as $s){
            echo "<tr>";

            for ($i = 1; $i <= 7; $i++) { 
              if(!empty($liste_numeros[$s][$i])){
                  echo "<td>".$liste_numeros[$s][$i]."</td>";
              }else{
                  echo "<td></td>";
              }
            }
            echo "</tr>";
          }
      
     ?>
     </tr>
    </tbody>
   </table>
0
YameFAZE Messages postés 201 Date d'inscription mardi 24 avril 2012 Statut Membre Dernière intervention 14 mars 2021 > jordane45 Messages postés 38145 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 25 avril 2024
3 mars 2019 à 17:28
Je ne fais pas de copier/coller comme tu dis, j'écris le code pour essayer de comprendre ce que tu as fait, à quoi cela servirait-il de faire un simple copier/coller. Donc oui je peux faire des erreurs d'écriture du coup. Ci-dessous une capture d'écran mise-à-jour suite à ton nouveau code. J'ai pourtant bien vérifié et je n'ai pas fait d'erreur. A quoi sert "!empty" ?

0
jordane45 Messages postés 38145 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 25 avril 2024 4 650
3 mars 2019 à 17:38
Pour le coup... petit oubli de ma part
il faut corriger la ligne
$liste_semaines[] = $semaine;

par
$liste_semaines[$semaine] = $semaine;


et pour le !empty ... la documentation officielle de PHP te le dira sans souci...
mais pour l'explication :
- Le "!" correspond à NOT
- empty : fonction qui vérifie qu'une variable existe et n'est pas vide
0