[RESOLU] Faire un calendrier.

Eléphant du PHP | 290 Messages

22 août 2014, 23:25

Merci pour ta réponse :D

Pour le type="type" oui, c'est mon champs caché.
Je voulais écrire type="hidden"
Aujourd'hui j'ai essayé type="text" juste pour voir ce qui apparaît
et j'ai laissé une coquille.

Merci pour toutes les corrections, et pour le $date = date("Y-m-").$date; :D
Si je comprends tout l'intérêt de ce précieux code, la concaténation permet d'ajouter
l'année et le mois qui manquaient mais d'adapter en php l'ordre sql année-mois-jour =>
0000-00-00 sur phpmyadmin tout en un!
C'est carrément génial!!

A propos de tes 1 et 2, j'ai pensé récemment que je dois permettre à mes clients de réserver
sur les 24 mois à venir.
Mon idée est d'abord de terminer le calendrier présent.
Chose faite, je fais un copier/coller du même calendrier 23 fois
en adaptant le deuxième pour qu'il se calque sur le mois suivant
(ce mois-ci +1) au lieu de ce mois-ci, en adaptant le deuxième
sur ce mois-ci + 2, ..., en adaptant le 23ème sur ce mois-ci + 23.
Je suppose ?? avoir juste une ligne de code ou deux à adapter sur
chaque calendrier. Je ne sais pas encore trop comment je vais m'y
prendre mais je vais voir, je vais essayer.
Ensuite, je pense coller deux images avec respectivement une flèche
suivant et une flèche précédent qui conduisent chacune vers un des
23 autres calendriers (vers le calendrier d'un autre mois) en mettant
les 24 calendriers dans un Switch.

1ère question: est-ce que tu penses que cette piste est assez abordable?
Si oui, je pense que ça devrais aller assez vite une fois le premier
calendrier terminé.
Si oui toujours, dans cette optique tu me conseilles de commencer par:
prendre ta solution 1 ou prendre ta solution 2 vue ci-dessus?

Eléphant du PHP | 113 Messages

23 août 2014, 13:04

Regarde vite fait les deux solutions :) Mais pour la suite il te faudra la 2ème

Ensuite l'affichage de ton calendrier c'est une fonction avec le paramètre $periode au format date YYYY-MM-JJ soit => (date("Y-m-d");)
Donc imaginons un bouton submit (name="suivant")avec la valeur suivante et un input hidden ave la valeur de $periode (que tu réutilisera avec la 2nd solution).
Si $_POST['suivant'] == "suivant" alors je fais showCalendar($periode + 1 mois)
Pour rajouter un mois à ta période il va falloir que tu décomposes la période grâce aux fonctions que tu as:
getDay, getMonth, et getYear. Tu prélèves le résultat de chacune de ces fonctions dans des variables.
Si getMonth > 12 Alors tu rajoutes une année au résultat de getYear (+1)
Tu assemble ta nouvelle variable $periode en concaténant l'année, un tiret, le mois, un tiret, le jour

Pour le bouton précédant c'est le même algorithme sauf qu'au test tu vérifie Si getMonth < 1 Alors tu enlèves une année au résultat de getYear (-1)

Eléphant du PHP | 290 Messages

25 août 2014, 11:19

Merci pour tout, c'est très sympa :D
Je garde sous le coude tous les tuyaux que tu me donnes.
Comme je dois faire chaque chose l'une après l'autre, je pense bien sûr à relire
les messages qui vont m'être utiles en temps opportun.
Je pense voir en premier le problème de la date car c 'est aujourd'hui ce qui me fait le plus de soucis.
Je cherche à mettre les deux variables dans des champs cachés
(que j'utilise comme champs text dans ma phase de travail pour voir mes réussites et mes échecs).
Avec le code suivant que j'ai essayé d'écrire je peux obtenir le mois et l'année dans un champs à part
mais dans ce cas d'une part le calendrier fais apparaître des cases pour l'année et le mois à l'écran,
et d'autre part l'utilisateur est obligé de cliquer une fois pour avoir le jour et une autre fois pour avoir l'année et le mois.
Je te montre ce que j'ai rajouté (j'ai rajouté un # derrière tout code php rajouté):
                if (1)                                                { //accolade d'ouverture 5
                    $class = " class=\"itemExistingItem\"";
                    $var_j = Date("d", mktime(0, 0, 0, getMonth($periode), 1 + $pas, getYear($periode)));					
                    $afficheJour = "<input type=\"button\" name=\"datejour\" value=\"" . $var_j . "\" onClick=\"date_id_jour.value=this.value;\">";
					$var_am = Date("Y-m", mktime(0, 0, 0, getMonth($periode), 1 + $pas, getYear($periode))); #code rajouté pour avoir l'année et le mois courants					
                    $afficheAnneeMois = "<input type=\"button\" name=\"dateanneemois\" value=\"" . $var_am . "\" onClick=\"date_id_annee_mois.value=this.value;\">"; #code rajouté pour avoir l'année et le mois courants

                                                                      } //accolade de fermeture 5
                     else                                             { //accolade d'ouverture 5 else
                          $class = "";
                                                                      } //accolade de fermeture 5 else
                                                                 } //accolade de fermeture 4 else
                     # Ajout de la case avec la date
                     $leCalendrier .= "\n\t\t<li$class>
                     $afficheJour</li>";
	     $leCalendrier .= "\n\t\t<li$class> 
                     $afficheAnneeMois</li>"; #code rajouté pour avoir l'année et le mois courants
	     $pas++;
                                                            } //accolade de fermeture 3
Ainsi que pour les champs cachés(que j'appelle text pour l'instant, je les appellerai hidden quand tout fonctionnera):
<input type="text" name="date_id_annee_mois" id="date_id_annee-mois" value="" />
<input type="text" name="date_id_jour" id="date_id_jour" value="" />
Je ne suis en fait pas surpris du résultat obtenu.
Le problème est que je n'arrive pas avec php à faire une dissociation entre ce que je veux permettre de s'afficher et d'être
sélectionné à l'écran et ce que je veux mettre dans mes champs cachés.
=> Je prends bien sûr la solution 2 que tu m'as proposée car c'est celle dont j'aurai besoin par la suite.

A propos de la clarté de mon formulaire, je me souviens très bien de la déclaration list-style-type:none;
qui m'a effectivement déjà bien servi pour améliorer l'apparence de mon calendrier en enlevant les puces.
L'idée que tu me suggères est donc de créer une liste à puces puis d'enlever ces mêmes puces?
C'est en fait quelque part faire et défaire pour avoir du code plus lisible si je comprends bien.

Eléphant du PHP | 113 Messages

25 août 2014, 12:56

$var_j = Date("d", mktime(0, 0, 0, getMonth($periode), 1 + $pas, getYear($periode)));                                       
                    $afficheJour = "<input type=\"button\" name=\"datejour\" value=\"" . $var_j . "\" onClick=\"date_id_jour.value=this.value;\">";
                                        $var_am = Date("Y-m", mktime(0, 0, 0, getMonth($periode), 1 + $pas, getYear($periode))); #code rajouté pour avoir l'année et le mois courants                                 
                    $afficheAnneeMois = "<input type=\"button\" name=\"dateanneemois\" value=\"" . $var_am . "\" onClick=\"date_id_annee_mois.value=this.value;\">"; #code rajouté pour avoir l'année et le mois courants
Je suppose qu'à la fin tu ne mettra qu'un seul button ?

<input type=\"button\" name=\"datejour\" value=\"" . $var_j . "\" onClick=\"date_id_jour.value=this.value; date_id_annee_mois.value='" . $var_am . "' \">"

"Le problème est que je n'arrive pas avec php à faire une dissociation entre ce que je veux permettre de s'afficher et d'être
sélectionné à l'écran et ce que je veux mettre dans mes champs cachés."

- J'ai pas vraiment compris ou tu voulais en venir :/

Pour ton formulaire tu peux faire comme tu veux, si tu veux aligner des éléments sur une même ligne ou colonne il existe des propriétés en css3 avec flex, ou sinon tu peux toujours le faire avec un float.

Eléphant du PHP | 290 Messages

25 août 2014, 16:43

Tu fais en fait porter à l'input la variable $var_am en plus de $var_j.

Ton code marche, merci pour le truc!
Il y a juste un détail qui m'échappe, c'est de savoir pourquoi tu n'as pas échappé ainsi tes apostrophes simples autour de value:
                    $var_j = Date("d", mktime(0, 0, 0, getMonth($periode), 1 + $pas, getYear($periode)));
					$var_am = Date("Y-m", mktime(0, 0, 0, getMonth($periode), 1 + $pas, getYear($periode))); #code rajouté pour avoir l'année et le mois courants					
                    $afficheJour = "<input type=\"button\" name=\"datejour\" value=\"" . $var_j . "\" onClick=\"date_id_jour.value=this.value; date_id_annee_mois.value='\" . $var_am . "\' \">";
au lieu de:
date_id_annee_mois.value='" . $var_am . "' \">";
Il s'agit bien des apostrophes de value="" qui doivent être échappées, non? contrairement aux apostrophes plus à l'intérieur qui indiquent qu'on parle de chaîne de caractères.
Si tu l'as fait il y a une raison, d'ailleurs le code marche. Je serais juste curieux de comprendre :)

Maintenant, mes champs suivants permettent de récupérer une date année + mois
0000-00
pour le premier
<input type="text" name="date_id_annee_mois" id="date_id_annee-mois" value="" />
et jour
00
pour le deuxième
<input type="text" name="date_id_jour" id="date_id_jour" value="" />
(je mettrai ces deux champs en hidden au lieu de text quand ça marchera)

Mais j'ai un problème avec la concaténation.
Dans la page de formulaire, j'ai essayé ainsi:
$id_annee_mois_envoye=$_POST['date_id_annee_mois'];
$date_id_jour_envoye=$_POST['date_id_jour'];
$date_id_envoye= '"$date_id_annee_mois_envoye"' . '"$date_id_jour_envoye"';
Ca ne fonctionne pas.
J'ai toujours 0000-00-00 dans ma table.
J'ai aussi essayé:
$id_annee_mois_envoye=$_POST['date_id_annee_mois'];
$date_id_jour_envoye=$_POST['date_id_jour'];
$date_id_envoye= $date_id_annee_mois_envoye . $date_id_jour_envoye;
Ca ne fonctionne pas non plus.
Est-ce que c'est bien comme ça que je dois faire ma concaténation?

Eléphant du PHP | 113 Messages

25 août 2014, 20:51

En fait pour tout ce qui est des apostrophes il faut que tu visualises ton input une fois affiché.

un string en php c'est avec des apostrophes, le value est délimité par des apostrophes aussi, enfin, en javascript, une chaîne de caractère est aussi délimité par des apostrophes. Du coup tu te retrouves avec ce que je t'ai écrit. Si tu les banalises comme dans ton cas, tu ne fermes pas la chaîne de caractère de ta variable php et tu empêche la concaténation de la variable. Sa demande une certaine gymnastique dans certains cas j'avoue ^^


Est-ce que tu as essayé de rajouter le tiret ?

$id_annee_mois_envoye=$_POST['date_id_annee_mois'];
$date_id_jour_envoye=$_POST['date_id_jour'];
$date_id_envoye= $date_id_annee_mois_envoye . "-" . $date_id_jour_envoye;

Eléphant du PHP | 290 Messages

26 août 2014, 14:42

Oui!! Cette fois ça y est, j'arrive à enregistrer la date :D
C'est très concis, je ne pensais pas qu'il était nécessaire d'ajouter le tiret entre 0000 et 00-00

Il me reste maintenant à récupérer la variable id_user dans la table.
Dans ma table d'identification (nom d'utilisateur/mot de passe), j'ai la valeur 1 pour le seul id_user que j'ai,
et dans le formulaire je récupère la valeur 0 au lieu de 1 (j'ai 0 comme valeur d'id_user dans ma table de réservations).

Dans le formulaire de ma page d'identification je récupère
bien l' id_user dans la table, et je le mets dans une variable session:
$nombase=mysqli_select_db($connexion,$nombase) or die ("Sélection de la base impossible.");
$req="SELECT id_user FROM identification WHERE nom_utilisateur='$nom_utilisateur_envoye'
                     AND mot_de_passe='$mot_de_passe_envoye'";
$query=mysqli_query($connexion,$req) or die ("Exécution de la requête impossible: ".mysqli_error($connexion));

$_SESSION['id_user'] = $id_user;
(=>question d'ailleurs, pourquoi du code de nettoyage doit être mis dans $req puisque les données viennent de ma table dans phpmyadmin?)

Ensuite, sur toutes mes pages de session je redirige l'utilisateur en dehors de la session si
l'id_user est absent:
<?php
session_start();
if (isset($_SESSION['id_user']) && ...
Dans la page du formulaire de réservation, un champs caché récupère
la variable pour le formulaire:
         <li><input type="hidden" name="id_user" value="id_user" /></li>
Et dans la page de traitement du formulaire, je récupère l'id_user posté:
$identification_id_user=$_POST['id_user'];
Je le nettoie:
$identification_id_user = mysqli_real_escape_string($connexion, $authentification_id_user);
et je l'insère dans la base avec les autres variables:
$req="INSERT INTO reservations (id_user,... ,... ,...)
VALUES('".$identification_id_user."',..., ..., ...)
Dans ma table identification il y a la valeur 1 pour l'id_user et je retrouve la valeur 0 dans la table reservations.
Je ne comprends pas, je ne vois pas ou ça peut clocher.
Plutôt que de dire que ma valeur se soit transformée en cours de route, se serait-elle perdue?

Eléphant du PHP | 113 Messages

26 août 2014, 17:21

en fait tu renvoyais ça sans le tiret : 0000-0000, le mois et le jour étaient attachés

Tu n'as pas besoin de mettre ton id_user dans un imput ! Il te suffit de faire une session_start dans ta page de traitement et tu pourras récupéré la valeur de $_SESSION['id_user'] ;) (en vérifiant qu'il existe toujours)

Pour ce qui est de la sécurité, il vaut mieux nettoyé ta variable avant l'enregistrement dans la bdd, mais par précaution tu peux aussi la nettoyer à la sortie.

Il te met "0" parce que regarde bien ton input: value="id_user" ... C'est un string, tu à surement voulu mettre $_SESSION['id_user'] ? là sa marchera ;) <input type="hidden" name="id_user" value="$_SESSION['id_user']" />

Eléphant du PHP | 290 Messages

27 août 2014, 10:46

Un grand merci pour tout :D
L'id_user s'enregistre bien!
J'ai aussi fais un peu le ménage: nettoyage des données à l'entrée, suppression des $_SESSION['mot_de_passe'],...

Mon calendrier sur un mois fonctionne :D
Maintenant j'aimerais l'étendre sur deux ans.
Tu m'as déjà donné des indications à suivre:
Ensuite l'affichage de ton calendrier c'est une fonction avec le paramètre $periode au format date YYYY-MM-JJ soit => (date("Y-m-d");)
Donc imaginons un bouton submit (name="suivant")avec la valeur suivante et un input hidden ave la valeur de $periode (que tu réutilisera avec la 2nd solution).
Si $_POST['suivant'] == "suivant" alors je fais showCalendar($periode + 1 mois)
Pour rajouter un mois à ta période il va falloir que tu décomposes la période grâce aux fonctions que tu as:
getDay, getMonth, et getYear. Tu prélèves le résultat de chacune de ces fonctions dans des variables.
Si getMonth > 12 Alors tu rajoutes une année au résultat de getYear (+1)
Tu assemble ta nouvelle variable $periode en concaténant l'année, un tiret, le mois, un tiret, le jour

Pour le bouton précédant c'est le même algorithme sauf qu'au test tu vérifie Si getMonth < 1 Alors tu enlèves une année au résultat de getYear (-1)
Je n'ai plus qu'à me mettre au travail.
Mais j'ai néanmoins déjà une question à propos de:
imaginons un bouton submit
Un bouton submit va rafraîchir la page du formulaire entier non?

Eléphant du PHP | 113 Messages

27 août 2014, 12:27

oui mais c'est pas trop un soucis puisque tu affiches un nouveau calendrier. Sinon tu peux le faire un ajax.

Eléphant du PHP | 290 Messages

27 août 2014, 12:40

J'ai très envie d'essayer avec ajax :D

Ca m'évitera de rafraîchir la page avec le bouton submit et j'améliorerai ainsi le confort de l'utilisateur.
En plus, j'ai vu ajax en théorie et j'ai l'occasion de le mettre en pratique.
Donc double motivation!!

Mais je ne sais pas si tu serais encore d'accord pour m'aider si j'ai des questions.
Je préfère demander avant car tout seul je n'y arriverai pas.

Si tu es OK, c'est bien sûr moi qui travaille. Je pose juste des questions quand je bloque.

Eléphant du PHP | 113 Messages

27 août 2014, 15:32

Pas de problème :) quant tu l'auras mis en ligne tu m’enverras le lien ;)

Eléphant du PHP | 290 Messages

28 août 2014, 18:06

Salut,

Ca marche pour le site.
Je t'enverrai le lien quand il sera publié, mais...
j'en ai encore pour un moment à travailler d'ici là!! :)

Bon, je m'attaque à mon programme ajax!!

Si je comprends bien, sur ma page du formulaire des réservations
j'ai un calendrier pour le mois courant qui marche très bien
et que je ne retouche pas,
auquel je vais rajouter deux étiquettes ou deux boutons
qui vont permettre d'envoyer des requêtes désynchronisées
au serveur afin d'engendrer à nouveau le calendrier
avec un mois de plus ou un mois de moins.
Je vais donc avoir deux programmes AJAX: un par bouton et chacun des deux programmes
va appeler un fichier php qui ajoutera ou enlèvera un mois au calendrier.

Je suppose que la raison pour laquelle AJAX est indispensable dans le cas où je ne veux pas rafraîchir
la page est qu'il faudrait générer 40 000 calendriers lors du chargement de la page du formulaire
des réservations afin que celle-ci contiennent tous les calendriers susceptibles d'intéresser
l'utilisateur, ce qui serait trop lourd.
C'est bien ça?

Dans l'idéal, j'aimerais mettre deux images pour "mois précédent" et "mois suivant"
au lieu de boutons.

intuitivement, j'écrirais dans le corps du formulaire de réservations (je commence par le mois suivant):

[javascript]
<script="text/javascript" />
//<![CDATA[
<div onclick="getAJAXmoisSuivant()">
<img src="moissuivant.jpg" alt="" />
</div>
[/javascript]

Je me demande si je peux mettre du html dans mon javascript
comme si de rien n'était => <img src="moissuivant.jpg" alt="" />

Dans l'entête du formulaire de réservations, je pense mettre:

[javascript]
<script type="text/javascript">
//[[![CDATA[

function getAJAXmoisSuivant(){

var request = new XMLHttpRequest(); //objet qui fait fonctionner AJAX
request.open ("POST", "ici_je_mets_le_nom_du_fichier_qui_genere_le_mois_suivant.php", true);
request.onreadystatechange = checkdate;
request.send(null);

function checkdata(){
if(request.readyState==4){
//si la requête est terminée
if(request.status==200){
//et si la requête est un succès
alert(request.responseText);
}
}
}


} //fin de la fonction globale
[/javascript]

Est-ce que ça va jusque là?
Il me faut ensuite écrire le fichier php qui régénère le calendrier avec un mois de plus.
Je ne touche pas à mon calendrier sur le mois courant dans ma page de formulaire de réservations, si?

Eléphant du PHP | 290 Messages

28 août 2014, 18:10

J'ai oublié de mettre :
[javascript]
//]]>
</script>
[/javascript]
à la fin de chacun de mes deux scripts.

Eléphant du PHP | 113 Messages

28 août 2014, 21:00

-Pour ton bouton tu peux simplement mettre un button et changer les propriétés css, fixer une taille égale à l'image que tu lui mettra en background.
Ensuite le html se met hors de ta balise script. Donc pour faire simple, tu crée un button (pas besoin de form) que tu transforme dans ton fichier css, et tu rajoutes onclik="appelDeTaFonctionJs"

-Après pour ton ajax, je te conseille, pour une question de lisibilité, de le faire dans un autre fichier, que tu appelleras sur ton formulaire avec: <script src=""></script>

-En gros l'ajax est utilisé pour ne pas avoir à recharger une page (très lourde généralement), pour y rajouter ou mettre à jour du contenu.

-Pour ton fichier php il te suffit juste de reprendre ta fonction de génération de calendrier, il te faudra penser aussi à ce que dans ta fonction js qui va faire l'ajax tu passes les paramètres de la période courante et du choix (suivant: 1 ou précédant: -1). Donc request.send(null); deviendra grâce au paramètre que tu auras récupéré à ta fonction js : request.send("periode=" + periode); (elle sera récupéré dans ton script php via un POST et de faire ton showCalendar puis de faire innerHTML(request.responseText) )