Introduction

Plusieurs années avant ma naissance, mes grands-parents ont décidé d’acheter un chalet dans les Alpes afin de permettre à toute la famille d’y passer du bon temps à randonner en été et à skier en hiver. Bien évidemment plus les années passent et plus les différents petits-enfants grandissent. Ce qui nous amène à aujourd’hui, où le nombre de personnes convoitant le chalet pour y passer du temps entre amis a bien plus que doublé, menant ainsi à des disputes qui n’avaient jamais eu lieu auparavant. J’ai donc pensé que la création d’un site privé de réservation pour les différentes chambres du chalet faciliterait grandement la tâche de mes grands-parents qui se sont attelés à gérer toutes les réservations de tous les amis, cousins, enfants ou petits-enfants depuis la fin de la construction de la propriété.

Le but principal de ce projet est de permettre aux utilisateurs (donc la famille) de réserver, en ligne, le chalet au complet. Le site initial se présenterait donc sous forme de calendrier avec les dates réservées indiqué par une couleur spécifique (le rouge par exemple) et le nom de la personne ayant réservé.

Une fois ceci créé, l’idéal serait de pouvoir utiliser un même système, permettant cette fois de réserver les chambres séparément afin de ne pas bloquer le chalet complètement en cas de réservation d’une personne seule. Sans pour autant retirer l’option de réserver le chalet entièrement. Ici le challenge principal sera de faire en sorte que les modifications de réservation d’une chambre s’appliquent à celles du chalet complet et inversement.

Finalement si le temps me le permet, j’aimerais pouvoir mettre le site sous forme de plan du chalet avec la possibilité de cliquer sur les chambres voulues afin de voir quelles sont les dates disponibles et de les réserver à une certaine date.

Méthode

Pour mener mon projet à bien, il me faudra suivre plusieurs étapes bien précises. Premièrement, il me faudra créer le plus important du projet, le corps même, le calendrier PHP. Pour ceci, le mieux sera de prendre un code déjà écrit, la création d'un calendrier en PHP étant complexe. Je tenterai ensuite d'y ajouter un système de réservation en utilisant des requêtes SQL et du code PHP, cela sera un bon moyen d'améliorer mes connaissances dans ces 

1. Création de la base de données

Avant de commencer avec la création du calendrier, il est important de créer la base de données afin de voir notre travail fonctionner.

Voici le fichier .txt dont vous aurez besoin pour la création de cette dernière.

2. Création d'un calendrier en PHP

La création d'un calendrier en php est plutôt longue et fastidieuse, en particulier pour un débutant en la matière comme moi. J'ai donc cherché un code de calendrier déjà fait sur le net et en ai trouvé un qui semblait être compatible à des modification afin d'y ajouter un service de réservation.

Voici le code du calendrier

Ici on commence par définir une Time Zone par défaut, en l'occurence Zurich. On essaie aussi de récupérer la date utilisée par l'utilisateur à partir de la ligne 10 en utilisant "$_GET".

<?php

// Date Suisse

date_default_timezone_set('Europe/Zurich');

// recuperation du jour, mois, et annee actuel

$jour_actuel = date("j", time());

$mois_actuel = date("m", time());

$an_actuel = date("Y", time());

$jour = $jour_actuel;

// si la variable mois n'existe pas, mois et annee correspondent au mois et a l'annee courante

if (isset($_GET["mois"])) 

{$mois=$_GET["mois"];} 

else{$mois = $mois_actuel;} 

if(isset($_GET["an"])) 

{$an=$_GET["an"];} 

else{$an = $an_actuel;}

Ensuit on définit les mois suivants en précédents par un simple calcul. On ajoute que lorsque le mois précédent est égal à 0, il faut passer au mois 12 de l'année précédente et lorsque le mois suivant est égal à 13, alors il faut passer au mois 1 de l'année suivante.

//defini le mois suivant 

$mois_suivant = $mois + 1;

//defini le mois suivant 

$mois_suivant = $mois + 1;

$an_suivant = $an;

if ($mois_suivant == 13)

{

$mois_suivant = 1;

$an_suivant = $an + 1;

}

//defini le mois precedent

$mois_prec = $mois - 1;

$an_prec = $an;

if ($mois_prec == 0)

{

$mois_prec = 12;

$an_prec = $an - 1;

}

Nous nous occupons maintenant de l'affichage du calendrier, rangeant les mois dans une array et créant un tableau à 31 entrées grâce à une loop.

//affichage du mois et de l'annee en francais

$mois_de_annee = array("Janvier", "Fevrier", "Mars", "Avril", "Mai", "Juin", "Juillet", "Aout", "Septembre", "Octobre", "Novembre", "Decembre");

$mois_en_clair = $mois_de_annee[$mois - 1];

// creation d'un tableau a 31 entree (1 par jour)

for($j = 1; $j < 32; $j++){

$tab_jours[$j] = (bool)false;

}

Création d'une table html pour afficher le tableau

<br />

<table align="center" width="420" border="0" cellpadding="5" cellspacing="0"  class="tab_cal">

<tr>

<td height="51" colspan="7">

<table width="381" border="0" cellpadding="0" cellspacing="0">

<tr>

 <td width="290" class="date"><div><?php echo $mois_en_clair," ", $an; ?></div></td>

<td width="50">

<a href="calendrier.php?mois=<?php echo $mois_prec; ?>&an=<?php echo $an_prec; ?>">

 <div align="left"><img border="0" src="img/prec.png" /></div></a>

 </td>

<td width="41">

<a href="calendrier.php?mois=<?php echo $mois_suivant; ?>&an=<?php echo $an_suivant; ?>">

 <div><img border="0" src="img/suiv.png" /></div>

 </a>

 </td>

</tr>

 </table>

 </td>

</tr>

<tr align="center" class="jours">

<td width="60">D</td>

<td width="60">L</td>

<td width="60">M</td>

<td width="60">M</td>

<td width="60">J</td>

<td width="60">V</td>

<td width="60">S</td>

</tr>

</table>

<table align="center"  width="420" border="0" cellpadding="5" cellspacing="0"  class="tab_numero">

<tr align="center">

Après avoir créé la table, il est temps de calculer combien de jours dure le mois affiché.

<?php

//Detection du 1er et dernier jour du mois

$nombre_date = mktime(0,0,0, $mois, 1, $an);

$premier_jour = date('w', $nombre_date);

$dernier_jour = 28;

while (checkdate($mois, $dernier_jour + 1, $an))

{ $dernier_jour++;}

Nous organisons ensuite les jours du calendrier 7 par 7 

//Affichage de 7 jours du calendrier

for ($i = 0; $i < 7; $i++){

if ($i < $premier_jour){ 

echo '<td width="60"></td>';

}else{

$ce_jour = ($i+1) - $premier_jour;

}

Finalement on affiche la fin du calendrier

$jour_suiv = ($i+1) - $premier_jour;

for ($rangee = 0; $rangee <= 4; $rangee++){

echo '</tr>';

echo '<tr align="center" class="numero">';

for ($i = 0; $i < 7; $i++){

if($jour_suiv > $dernier_jour){ 

echo '<td width="60">';

echo '</td>';

}else{

// si c'est un jour reserve on applique le style reserve

if($tab_jours[$jour_suiv]){

echo '<td width="60" class="reserve">';

// sinon on ne met pas de style

}else{

echo '<td width="60">';

}

//echo $tab_jours[$jour_suiv];

echo $jour_suiv;

echo '</td>';

}

$jour_suiv++;

}

}

?>

</tr>

</table>

<table align="center" width="420" height="121" border="0" cellpadding="0" cellspacing="0">

  <tr>

    <td width="60" height="43" align="center"><img border="0" src="img/prec.png" /></td>

    <td width="380"><div class="descriptif"> Voir le mois suivant.</div></td>

  </tr>

  <tr>

    <td width="60" height="46" align="center"><img border="0" src="img/suiv.png" /></td>

    <td><div class="descriptif"> Voir le mois Precedant </div></td>

  </tr>

  <tr>

    <td width="60" align="center" height="32" class="reserve">XX</td>

    <td><div class="descriptif"> Jour deja reserve..</div></td>

  </tr>

</table>

3. Pages indispensables au fonctionnement:

3.1 Fichier CSS

3.2 Liste des chalets

3.3 Ajout de chalet

3.4 Configuration

3.5 Changement et Visualisation des réservations

Résultats

Voici le résultat accompagné du CSS (les images des boutons n'apparaissent pas car elles sont bloquées par le serveur).
Calendrier en mai:

Février pour vérifier le bon compte de jours par mois:

Page d'ajout de chalet à la base de donnée:

Discussion

Mises à part les images qui sont bloquées par le serveur, le calendrier marche très bien, il arrive à bien calculer le nombre de jours présents dans chaque mois ainsi qu'à trouver la date du client. Malheureusement je suis dans l'incapacité de créer un chalet à travers la page "add.php". Ayant vérifié le code de nombreuses fois il semblerait que le problème vienne de ma base de données, je n'ai cependant pas réussi à identifier ce que le problème pourrait être ou même où il pourrait se trouver. Ce qui m'intrigue le plus est que j'ai réussi à insert des données sur la base à travers une fenêtre de test de cette dernière ("TEST.php"). Malgré tout, je n'ai ensuite pas réussi à select le chalet en question plus tard sur la page créée à cet effet. Ce genre de problèmes m'a beaucoup découragé sur la fin de mon projet car j'avais l'impression de travailler toujours pour, au final, ne faire presque aucune avancée. Je pense que les erreurs reliées à MySQL ont été celles qui m'ont posé le plus de problèmes tout au long de ce projet, premièrement parce que je n'avais jamais fait usage de bases de données sans utiliser de CMS auparavant mais aussi car il m'a été très difficile d'identifier d'où elle venaient en général. 

Conclusion

Après plusieurs heures de travail, à rechercher des codes qui pourraient me permettre de me rapprocher de mon but, à en corriger certains, à faire des recherches sur les origines de mes erreurs, j'arrive maintenant à la deadline sans avoir réussi à atteindre mon but initial. Je sens pourtant que seules quelques petites erreurs que je n'ai pas trouvées dans le code me séparent de ce but et c'est ce qui m'encourage à travailler dessus encore et encore jusqu'à ce que je les trouve. C'est le fait de me sentir si proche du but qui me frustre autant tout en me donnant envie d'en apprendre encore plus que ce que j'ai appris en avançant peu à peu sur ce projet. Bien évidemment la déception est importante en sachant que je n'ai pu terminer ce travail mais malgré tout je suis assez fier de tout ce que j'ai pu apprendre jusque là.

Sources

  • stackoverflow.com
  • w3schools.com
  • codes-sources.commentcamarche.net
  • www.startutorial.com
  • davidwalsh.name