Menu

Automatiser un calendrier statique [Résolu]

Messages postés
165
Date d'inscription
mardi 24 avril 2012
Statut
Membre
Dernière intervention
21 mai 2019
- - Dernière réponse : YameFAZE
Messages postés
165
Date d'inscription
mardi 24 avril 2012
Statut
Membre
Dernière intervention
21 mai 2019
- 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
Afficher la suite 

3 réponses

Messages postés
7833
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
18 juin 2019
388
0
Merci
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.
Commenter la réponse de yg_be
Messages postés
25780
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
18 juin 2019
1665
0
Merci
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>";

jordane45
Messages postés
25780
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
18 juin 2019
1665 -
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
Commenter la réponse de jordane45
Messages postés
165
Date d'inscription
mardi 24 avril 2012
Statut
Membre
Dernière intervention
21 mai 2019
0
Merci
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>
jordane45
Messages postés
25780
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
18 juin 2019
1665 -
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>
YameFAZE
Messages postés
165
Date d'inscription
mardi 24 avril 2012
Statut
Membre
Dernière intervention
21 mai 2019
> jordane45
Messages postés
25780
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
18 juin 2019
-
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" ?

jordane45
Messages postés
25780
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
18 juin 2019
1665 -
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
jordane45
Messages postés
25780
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
18 juin 2019
1665 -
Et concernant :

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.

Que tu veuilles le réécrire au lieu de copier/coller ... OK
Mais vouloir..; en même temps, renommer les variables.... aie !

Il suffit, après l'avoir copié/collé d'essayer de comprendre le code.
.. écrire le code lettre par lettre ou le coller ne change rien à la compréhension.
YameFAZE
Messages postés
165
Date d'inscription
mardi 24 avril 2012
Statut
Membre
Dernière intervention
21 mai 2019
> jordane45
Messages postés
25780
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
18 juin 2019
-
Ca fonctionne nickel. Je vais maintenant essayer de comprendre ton code en prenant le temps de me documenter sur ce que je ne connais pas. Prochaine étape, l'associer à une BDD. Merci.
Commenter la réponse de YameFAZE