[RESOLU] Faire un calendrier.

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : [RESOLU] Faire un calendrier.

Re: Faire un calendrier.

par niconicochan » 15 sept. 2014, 13:11

Je t'ai envoyé la réponse en mp.

Re: Faire un calendrier.

par toytoy » 15 sept. 2014, 09:58

en fait
function getSecond($valeur) {
 return substr($valeur, 17, 2);
   }

   function getMinute($valeur) {
       return substr($valeur, 14, 2);
   }

  function getHour($valeur) {

      return substr($valeur, 11, 2);
  }
tu n'en a jamais besoins. Quand tu déclares une fonction, elle n'existe que le temps ou le serveur traite ton code, après elle n'est déjà plus là. C'est pourquoi il faut l re-déclarer sur l'autre page, les deux pages étant indépendantes.

1) ? voir le fichier php ? tu entends quoi ?
2) mp = message privé, regarde il y a un bouton mp à côté de mon nom
Le seul moment ou ta variable $periode passe en javascript c'est grâce à l'évènement sur tes bouton que tu récupères sous le nom periode (ou comme tu veux, c'est juste le nom du paramètre que ta fonction demande en js)
3) normalement
4) si tu veux mettre une valeur en caché utilises un input hidden, à moins d'afficher la valeur de ta variable avec un echo dans ton dic, puis en css mettre un hidden à ce div et le récupéré avec innerHTLM sur ce div en js (input hidden est mieux hein?! ^^)

Re: Faire un calendrier.

par niconicochan » 12 sept. 2014, 11:55

Pour ce qui est des fonction à déclarer, je fais un simple papier/coller
de toutes mes fonctions déclarées dans mon formulaire
(il s'agit en effet exactement des mêmes fonctions que j'ai besoin de déclarer).
Je recoller ces fonctions en haut de mon fichier php, ce qui donne pour mon fichier php:
<?php
//nouvelle déclaration de mes fonctions
 function getSecond($valeur) {
 return substr($valeur, 17, 2);
   }

   function getMinute($valeur) {
       return substr($valeur, 14, 2);
   }

  function getHour($valeur) {

      return substr($valeur, 11, 2);
  }

  function getDay($valeur)     {
     return substr($valeur, 8, 2);
  }

  function getMonth($valeur)     {
     return substr($valeur, 5, 2);
  }

  function getYear($valeur) {
     return substr($valeur, 0, 4);
 }

  function monthNumToName($mois) {
    $tableau = Array("", "Janvier", "Février", 
    "Mars", "Avril", "Mai", "Juin", "Juillet", 
    "Aôut", "Septembre", "Octobre", "Novembre", "Décembre");

    return (intval($mois) > 0 && intval($mois) 
    < 13) ? $tableau[intval($mois)] : "Indéfini";	
}
function showCalendar($periode) { //accolade d'ouverture 1
    $leCalendrier = "";
    # Tableau des valeurs possibles pour un numéro 
    # de jour dans la semaine
    $tableau = Array("0", "1", "2", "3", "4", "5", "6", "0");

    $nb_jour = Date("t", mktime(0, 0, 0, getMonth($periode), 
    1, getYear($periode)));
    $pas = 0;
    $indexe = 1;

    # Affichage du mois et de l'année
    $leCalendrier .= "<h2>" . monthNumToName
    (getMonth($periode)) . " " . getYear($periode) . "</h2>";

    # Affichage des entêtes
    $leCalendrier .= "
    <ul id=\"libelle\">
        \t<li>&nbsp;L</li>
        \t<li>&nbsp;M</li>
        \t<li>&nbsp;M</li>
        \t<li>&nbsp;J</li>
        \t<li>&nbsp;V</li>
        \t<li>&nbsp;S</li>
        \t<li>&nbsp;D</li>
    </ul>";

    # Tant que l'on n'a pas affecté tous les jours du mois traité
      while ($pas < $nb_jour)                { //accolade d'ouverture 2
        if ($indexe == 1) $leCalendrier .= 
        "\n\t<ul class=\"ligne\">";

        # Si le jour calendrier == jour de la semaine en cours
        if (Date("w", mktime(0, 0, 0, getMonth($periode), 
        1 + $pas, getYear($periode))) == $tableau[$indexe]) { //accolade d'ouverture 3
          # Si jour calendrier == aujourd'hui
          $afficheJour = Date("d", mktime(0, 0, 0, 
          getMonth($periode), 1 + $pas, getYear($periode)));
          if (Date("Y-m-d", mktime(0, 0, 0, getMonth($periode),
          1 + $pas, getYear($periode))) == Date("Y-m-d"))        { //accolade d'ouverture 4
                $class = " class=\"itemCurrentItem\"";
                                                                 } //accolade de fermeture 4
          else                                                   { //accolade d'ouverture 4 else
                # 1 est toujours vrai => on affiche 
                # un lien à chaque fois
                # A vous de faire les tests 
                # nécessaire si vous gérer un agenda par exemple
                if (1)                                                { //accolade d'ouverture 5
                    $class = " class=\"itemExistingItem\"";
                    $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 . "' \">";

                                                                      } //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>";
					 $pas++;
                                                            } //accolade de fermeture 3
             else { //accolade d'ouverture 3 else

                    # Ajout d'une case vide
                    $leCalendrier .= "\n\t\t<li>&nbsp;</li>";
             } //accolade de fermeture 3 else
             if ($indexe == 7 && $pas < $nb_jour) 
             { $leCalendrier 
             .= "\n\t</ul>"; $indexe = 1;} else {$indexe++;}
                                             } //accolade de fermeture 2

          # Ajustement du tableau
          for ($i = $indexe; $i <= 7; $i++)                           { //accolade d'ouverture 6
               $leCalendrier .= "\n\t\t<li>&nbsp;</li>";
                                                                      } //accolade de fermeture 6
          $leCalendrier .= "\n\t</ul>\n";

          # Retour de la chaine contenant le Calendrier
          return $leCalendrier;

                                 } //accolade de fermeture 1 
//fin de nouvelle déclaration de mes fonctions

if (!empty($_POST['operation']) && !empty($_POST['periode'])) {

    //extraction des variables
    $periode = htmlentities($_POST['periode']);
    $month = getMonth($periode);
    $year = getYear($periode);
    $operation = $month + htmlentities($_POST['operation']); 

    //Calcul de la période après modification du mois
    $periode = date("Y-m-d",mktime(0,0,0,$operation,1,$year));
	
    //Affichage de la réponse pour ajax: calendrier + champs hidden (utile pour le formulaire ET l'ajax)
    showCalendar($periode);
    echo '<input type="hidden" name="date_id_annee_mois" id="date_id_annee-mois" value="',$year,'-',$month,'" />
            <input type="hidden" name="date_id_jour" id="date_id_jour" value="01" />';
}
?>
Voilà ce que ça donne déjà pour mon fichier php.
Le navigateur veut aussi que je déclare la fonction showCalendar.
C'est pour cela que j'ai pensé à tout reprendre, du coup.
Mais ça fait beaucoup d'informations non.

J'ai en fait d'abord essayé quelquechose comme:
function getDay($date){
$valeurD = date("d");
         return substr($valeurD, 8, 2);
}
function getMonth($date) {
$valeurM = date("m");
	     return substr($valeurM, 5, 2);
}
function getYear($date){
$valeurY = date("Y");
	     return substr($valeurY, 0, 4);
}
pour réduire mon code, mais le navigateur m'a alors demandé de déclarer aussi le calendrier...

1) Voilà, je ne sais pas si on peut déjà regarder le fichier php?
2) A propos, c'est quoi mp?
mot de passe? mettre le fichier en PJ?

Par rapport à ma question:
Est-ce que je dois déclarer ma variable $periode dans mon fichier js pour qu'elle soit reconnue?
si j'ai bien compris la réponse est oui, mais sa déclaration est reprise par:
[javascript]
document.getElementById('boutonprec').addEventListener('click',function() { getAJAXmois(document.getElementById('date_id_annee-mois').value,-1) }, false);
document.getElementById('boutonsuiv').addEventListener('click',function() { getAJAXmois(document.getElementById('date_id_annee-mois').value,1) }, false);
[/javascript]
3) donc rien de plus à rajouter, c'est bien ça?
4) ...donc pas besoin de mettre la variable période dans un div comme on le fait habituellement pour récupérer le div en question avec
var leDivEnQuestion = document.getElementById('leDivEnQuestion');
puisque c'est déjà fait dans
[javascript]
document.getElementById('boutonprec').addEventListener('click',function() { getAJAXmois(document.getElementById('date_id_annee-mois').value,-1) }, false);
document.getElementById('boutonsuiv').addEventListener('click',function() { getAJAXmois(document.getElementById('date_id_annee-mois').value,1) }, false);
[/javascript]
C'est ça?

Re: Faire un calendrier.

par toytoy » 12 sept. 2014, 09:18

Le code Ajax me semble bon, la prochaine fois pourrais tu m'envoyer (par mp) le détails de tes codes? Sa sera plus simple pour repéré une erreur, je posterais alors sur le forum là ou il y avait des coquilles

1) Non je te parle de déclarer la fonction:

function getMonth($date) {
... //le code de la fonction...
}

2) La variable periode correspond à cette valeur: <input type="hidden" name="date_id_annee_mois" id="date_id_annee-mois" value="<?php echo date("Y-m"); ?>" />
que l'on récupère lorsqu'on crée l’événement sur le bouton:

document.getElementById('boutonprec').addEventListener('click',function() { getAJAXmois(document.getElementById('date_id_annee-mois').value,-1) }, false);
document.getElementById('boutonsuiv').addEventListener('click',function() { getAJAXmois(document.getElementById('date_id_annee-mois').value,1) }, false);


PS:

Code php
<div id="variablePeriode">
<?php
//initialisation par défaut à aujourd'hui
$periode = date("Y-m-d");
?>
</div>

De cette manière tu obtiendras un div vide, $periode = date("Y-m-d"); ne génère aucun html et n’attribue en aucun cas la valeur de $periode à div !

Re: Faire un calendrier.

par niconicochan » 11 sept. 2014, 15:01

A propos de
1) Il faut que tu comprennes que pour chaque fichier php tu as besoin de réecrire la fonction dans ton code, sinon elle n'existe pas.
J'ai bien mes fonctions annoncées à nouveaux dans mon fichier php:
    $month = getMonth($periode);
    $year = getYear($periode);
Du coup je ne comprends pas très bien ce que tu veux me dire ou me faire comprendre pour 1)

A propos de
2) Ton ajax utilises la méthode POST, comme les formulaires en générales, tu récupèreras tes variables avec $_POST[]
Oui, mais c'est bien ce qu'on fait dans le fichier php:
$periode = htmlentities($_POST['periode']);
$operation = $month + htmlentities($_POST['operation']);
Donc là aussi c'est bon il me semble. Non?

A propos de ma question:
Est-ce que je dois déclarer ma variable $periode dans mon fichier js pour qu'elle soit reconnue?
Je voudrais savoir si j'ai besoin pour chaque fichier javascript de réecrire la variable dans le code, sans quoi elle n'existe pas
(dans 1) tu m'as donné la réponse pour chaque fichier php mais je voudrais savoir ce qu'il en est pour les fichiers javascript)?
Je suppose que la réponse est oui car tu me montre comment faire.
J'ai essayé:
=>dans formulaire
<div id="variablePeriode">
<?php
//initialisation par défaut à aujourd'hui
$periode = date("Y-m-d");
?>
</div>
=> puis dans fichier js
[javascript]
var periode = document.getElementById('variablePeriode');
[/javascript]
puis plus loin j'ai toujours:
[javascript]
xhr.send("operation=" + operation + "&periode=" + periode); // Ici tu peux faire passer des variables vers ta cible
[/javascript]
</div>
Rien ne change.
Mais il faut faire comme ça pour que la variable "passe" dans le fichier js et puisse aller dans le fichier php?
Désolé si je suis dur à la compréhension, mais c'est difficile #-o
Je ne vois vraiment pas où la variable "peut se perdre" en chemin.

Re: Faire un calendrier.

par niconicochan » 11 sept. 2014, 12:35

Mais je me demande si je n'ai pas un soucis à cet endroit de ma page js:
[javascript]
xhr.open("POST", "change_month.php", true); //Ca peut être GET aussi
xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
xhr.send("operation=" + operation + "&periode=" + periode); // Ici tu peux faire passer des variables vers ta cible

xhr.onreadystatechange; // c'est cette partie qui vas nous intéresser !

xhr.onreadystatechange = function() { //Fonction pour permettre l'affichage du nouveau calendrier initialisé
[/javascript]

En effet, mon éditeur mets une couleur à open, mais setRequestOrder, send et onreadystatechange restent en noirs,
comme si leur signification n'était pas comprise ou prise en compte.
Je vois que sur ton code il y a à chaque fois des couleurs.
Pourtant c'est le même!!

Re: Faire un calendrier.

par toytoy » 11 sept. 2014, 12:30

(Récap ajax: fichier php que l'utilisateur voir, ton js appelle une autre page php que l'utilisateur ne verra pas. Le seul lien entre ces deux fichiers php est javascript. Donc les données php ne peuvent être partagés entre les deux fichiers que par la requete ajax)


1) Il faut que tu comprennes que pour chaque fichier php tu as besoin de réecrire la fonction dans ton code, sinon elle n'existe pas.

2) Ton ajax utilises la méthode POST, comme les formulaires en générales, tu récupèreras tes variables avec $_POST[]

3) document.getElementById('idDeMonDiv') => récupère l'élément dont son id (en html) est idDeMonDiv ex: <div id="idDeMonDiv">

Re: Faire un calendrier.

par niconicochan » 11 sept. 2014, 12:13

<?php
function mafonction(){}
var_dump(function_exists('getMonth'));
?>
dans ma page du formulaire de réservations donne bool(true) et dans mon fichier php bool(false)
la fonction getMonth se trouve donc dans ma page du formulaire de réservations mais elle ne va
pas jusque dans le fichier php d'après donc, ce que me dit le navigateur.
Dans ce fichier php, la fonction getMonth devrait se trouver dans la variable $periode n'est-ce pas?
Si je test dans ce fichier php:
<?php
if (isset($periode))
{ echo "yes";
} else {
echo "pas de variable periode";
}
?>
Le navigateur informe: pas de variable periode
Ce serait donc la variable $periode qui ne passe pas.

Le fichier js lui doit bien faire passer cette variable:
[javascript]
xhr.send("operation=" + operation + "&periode=" + periode); // Ici tu peux faire passer des variables vers ta cible
[/javascript]
On voit pourtant dans ma page du formulaire de réservation (dans l'en-tête de la page),
que la variable $periode se trouve bien dans cette page là:
<!-- code spécifique pour le programme ajax du calendrier partie 1/2 -->
<script src="calendar_ajax.js"></script>
<?php
//initialisation par défaut à aujourd'hui
$periode = date("Y-m-d");
?>
mais "elle ne passe pas" dans le lien qui renvoit sur la feuille externe js.
A moins qu'elle passe mais qu'il faille déclarer la variable dans le fichier js.
Quelque chose du style:
[javascript]
var periode = document.getelementbyId('periode');
[/javascript]
=>mais ça ça ne tient pas la route parce-que periode n'est pas un Id.

Est-ce que déjà mon résonnement est bon?
Est-ce que je dois déclarer ma variable $periode dans mon fichier js pour qu'elle soit reconnue?
Si oui, comment je peux coder la chose sachant que je n'ai pas d'Id?

A propos de la redondance dont tu m'as parlé j'ai enlevé onclick="..."
Je n'avais pas compris que
[javascript]
document.getElementById('boutonprec').addEventListener('click',function() { getAJAXmois(document.getElementById('date_id_annee-mois').value,-1) }, false);
document.getElementById('boutonsuiv').addEventListener('click',function() { getAJAXmois(document.getElementById('date_id_annee-mois').value,1) }, false);
[/javascript]
n'était pas là juste pour reprendre l'événement onclick mais pour le créer! Donc pas besoin de la première occurence onclick="..." pour créer l'événement.

Re: Faire un calendrier.

par toytoy » 11 sept. 2014, 09:14

Tu as à bien nettoyé tes codes, enlever tous ce qui était inutile ? Par exemple là:

<button type="button" id="boutonprec" class="boutonprec" onclick="getAJAXmois(\'',$periodePrec,'\')" onFocus="this.style.borderColor=\'#33CCFF\';" onBlur="this.style.borderColor=\'#000000\';">mois précédent</button>
<button type="button" id="boutonsuiv" class="boutonsuiv" onclick="getAJAXmois(\'',$periodeSuiv,'\')" onFocus="this.style.borderColor=\'#33CCFF\';" onBlur="this.style.borderColor=\'#000000\';">mois suivant</button>


tu dois enlever le onclick, ensuite vérifie que la fonction getMonth se trouve bien dans ton fichier, apparemment ton code ne l'as pas trouvé

Re: Faire un calendrier.

par niconicochan » 10 sept. 2014, 18:12

Merci pour les précisions et pour toutes les confirmations.

J'ai, comme tu me l'as conseillé, mis le script js dans le corps sous le onclick, comme ceci:
<?php
echo '<button type="button" id="boutonprec" class="boutonprec" onclick="getAJAXmois(\'',$periodePrec,'\')" onFocus="this.style.borderColor=\'#33CCFF\';"         onBlur="this.style.borderColor=\'#000000\';">mois précédent</button>
<button type="button" id="boutonsuiv" class="boutonsuiv" onclick="getAJAXmois(\'',$periodeSuiv,'\')" onFocus="this.style.borderColor=\'#33CCFF\';"         onBlur="this.style.borderColor=\'#000000\';">mois suivant</button>';
?>
<!-- Ajout d'évènement javascript aux boutons suivant et précédent (équivalent de onclick="") -->
[javascript]
<script>
document.getElementById('boutonprec').addEventListener('click',function() { getAJAXmois(document.getElementById('date_id_annee-mois').value,-1) }, false);
document.getElementById('boutonsuiv').addEventListener('click',function() { getAJAXmois(document.getElementById('date_id_annee-mois').value,1) }, false);
</script>
[/javascript]

Quand je cliques sur les boutons du mois suivant ou du mois précédent en tant qu'utilisateur,
le navigateur informe:
Fatal error: Call to undefined function getMonth() in C:\xampp\htdocs\mon_site\change_month.php on line 10
Très curieux.
Dans mon formulaire j'annonce bien:
<?php
//initialisation par défaut à aujourd'hui
$periode = date("Y-m-d");
?>
Dans mon fichier js je fais fais passer la variable periode:
[javascript]
xhr.send("operation=" + operation + "&periode=" + periode); // Ici tu peux faire passer des variables vers ta cible
[/javascript]
dans le fichier php où je la retrouve:
if (!empty($_POST['operation']) && !empty($_POST['periode'])) {
    //extraction des variables
    $periode = htmlentities($_POST['periode']);
    $month = getMonth($periode);
    $year = getYear($periode);
Je me demande donc pourquoi le navigateur considère que la fonction getMonth($periode)
n'est pas déclarée.
Si je mets la ligne
$month = getMonth($periode);
en commentaire ( avec un # devant), pour voir comment le navigateur lit la ligne suivante,
il dit alors que la fonction getYear($periode) n'est pas déclarée.
Tu sais pourquoi?

Re: Faire un calendrier.

par toytoy » 10 sept. 2014, 10:46

1) a) Il est conseiller d'instaurer les évènements (Comme le javascript, mais c'est juste conseilé) après que tout ceux-ci soient chargées, soit à la fin de la page.
b) 1 ou +1 revient à la même chose... le +1 est interprété comme un 1
c) Oui, en effet puisqu'on le traiteras via ajax :)

2) a) Oui en clair c'est un peu ça :)
b) showCalendar(date("Y-m")); afficheras le calendrier du mois courant
showCalendar($periode); afficheras le calendrier d'un mois donné pour une année donné

3) a) Le send est le passage des variables vers ton fichier php. C'est ainsi que les get et post sont retranscrit dans les trames, (un peu comme les get dans l'url) var1=val1&var2=val2&var3....
b) $operation te permet de calculer la periode dans le php cible de l'ajax:
$operation = $month + htmlentities($_POST['operation']); 
      //Calcul de la période après modification du mois
      $periode = date("Y-m-d",mktime(0,0,0,$operation,1,$year));
Elle correspondt au -1 et 1 de tes boutons suiv et prec

Pour le problème des boutons je vais regarder sur l'affichage de ton calendrier, mais l'erreur se trouve dans la fonction showCalendar

Re: Faire un calendrier.

par niconicochan » 09 sept. 2014, 15:05

Merci à tous pour vos réponses :D

Oui, j'ai effectivement parlé d'un problème plus interne au calendrier en lui-même:
quelque soit la semaine et le mois courant, les jours de la deuxième ligne du calendrier
sont impossibles à sélectionner.
Je comprends le "Merci pour tout..." car ma remarque vient effectivement comme un cheveu sur la soupe en plein programme Ajax.
Je donne juste l'explication et je ferme la parenthèse: je vais absolument devoir trouver une solution au problème et
comme le problème sera répercuté sur tout le programme Ajax, je me suis demandé s'il ne serait pas judicieux de le régler
avant de continuer sur Ajax car si je n'ai pas de solution pour ça, alors l'Ajax n'apportera pas le résultat attendu
(toutes les lignes du calendrier doivent fonctionner).
Mais je me suis acheté des livres plus spécifiques sur le javascript et l'Ajax ces derniers jours, ainsi que sur les calendriers.
Je propose donc que je regarde tout seul si je trouve la solution au problème avec mes nouveaux bouquins
et que nous revenions maintenant à l'Ajax :)

Le programme Ajax est dur à concevoir #-o
J'aimerais poser quelques nouvelles questions très précises afin de m'assurer de ma bonne compréhension.

1) J'ai trois choses qui me préocupent quant à:
Morceau de javascript à rajouter à la fin de ton fichier du formulaire,
<script>
//Ajout d'évènement javascript aux bouton suivant et précédent (équivalent de onclick="")
document.getElementById('boutonprec').addEventListener('click',function() { getAJAXmois(document.getElementById('date_id_annee-mois').value,-1) }, false);
document.getElementById('boutonsuiv').addEventListener('click',function() { getAJAXmois(document.getElementById('date_id_annee-mois').value,1) }, false);
</script>
a) la récupération des données en javascript se fait bien dans l'en-tête et non dans le corps.
J'ai des id dans un div dans le corps que je récupère avec document.getElementBy Id('mon_Id') dans mon en-tête,
alors pourquoi mettre cette portion de code à la fin du fichier du formulaire de réservation? (dans le corps?)
b) ce ne serait pas plutôt +1 que 1 à la deuxième ligne?
c) est-ce que cette nouvelle portion de code me dispense d'écrire dans mon fichier php:
$periodePrec = date("Y-m-d",mktime(0,0,0,getMonth($periode)-1,1,getYear($periode)));
$periodeSuiv = date("Y-m-d",mktime(0,0,0,getMonth($periode)+1,1,getYear($periode)));
Mon gestionnaire d'évènement (avec .addEventListener) comprend en effet les deux mêmes fonctions non?

2) Avec la partie de code:
xhr.onreadystatechange  = function() { //Fonction pour permettre l'affichage du nouveau calendrier initialisé
                 if ((xhr.readyState == 4) && (xhr.status == 200)) {				  
					   document.getElementById('output').innerHTML = xhr.responseText;
dans mon fichier js (programme Ajax), je cherche donc à remplacer
le calendrier par défaut (celui du mois courant) + les champs cachés par défaut => getElementById('output') récupère
    <!-- Affichage du calendrier -->
]<?php showCalendar($periode); ?>
<input type="hidden" name="date_id_annee_mois" id="date_id_annee-mois" value="<?php echo date("Y-m"); ?>" />
<input type="hidden" name="date_id_jour" id="date_id_jour" value="<?php echo date("d"); ?>" />

et le remplace par => inner.HTML
le nouveau calendrier + les nouveaux champs cachés => xhr.responseText qui fait référence dans le fichier php à
    showCalendar($periode);
    echo '<input type="hidden" name="date_id_annee_mois" id="date_id_annee-mois" value="',$year,'-',$month,'" />
            <input type="hidden" name="date_id_jour" id="date_id_jour" value="01" />';
a) C'est bien ça?
b) Dans mon div avec id="output"
<?php showCalendar($periode); ?>
représente donc le calendrier -soit du mois courant si l'utilisateur n'appuie sur aucun bouton
-soit d'un autre mois si l'utilisateur a appuyé au moins une fois sur un des deux boutons
et ce calendrier est affiché par le programme d'origine avec:
echo showCalendar (date("Y-m"));
Ce que je veux dire c'est que
echo showCalendar (date("Y-m"));
reprend
<?php showCalendar($periode); ?>
quel que soit le mois du calendrier qu'il y a dans
<?php showCalendar($periode); ?>
C'est bien ça?

3) Dans le fichier js
[javascript]
xhr.send("operation=" + operation + "&periode=" + periode) // Ici tu peux faire passer des variables vers ta cible
[/javascript]
a) Mes deux variables sont operation et periode, n'est-ce pas?
Je pose la question car il n'y a pas de $ devant, ce qui est assez déroutant quand on a l'habitude de voir un dollar pour annoncer une variable.
b) Pour ce qui est de periode, on parle de cette variable dans le formulaire
mais pour ce qui est de operation, on voit ici cette variable pour la première fois
(on a dis qu'on ne reprend pas finalement le code complexe où tu utilisais une variable nommée operation).
De ce fait, comment pourrait-elle être présente dans le fichier php?
=>
if (!empty($_POST['operation']) && !empty($_POST['periode'])) {

Re: Faire un calendrier.

par toytoy » 05 sept. 2014, 20:28

Récapitulons notre cas, je ne parlerai que de ce dont on a besoin pour le moment. J'essaie d'être clair, je te balance ce code parce que je me suis trompé dans mon raisonnement ^^ (comme expliqué dans le post après ta réponse). Bref place à la solution :)

Tu as en entête de ta page formulaire:
//initialisation par défaut à aujourd'hui
$periode = date("Y-m-d");
Sur ta page du formulaire tu as ces éléments présents (normalement)
<div id="output">
   <!-- Affichage du calendrier -->
   <?php showCalendar($periode); ?>

   <!-- Important à initialiser avec une valeur par défaut (aujourd'hui) pour pouvoir faire suivant ou précédant -->
   <!-- Important que ces deux champs se trouvent dans le div output ! car mise à jour lors de l'ajax !              -->
   <input type="hidden" name="date_id_annee_mois" id="date_id_annee-mois" value="<?php echo date("Y-m"); ?>" />
   <input type="hidden" name="date_id_jour" id="date_id_jour" value="<?php echo date("d"); ?>" />

</div>

<button type="button" id="boutonprec" class="boutonprec" onFocus="this.style.borderColor=\'#33CCFF\';" onBlur="this.style.borderColor=\'#000000\';">mois précédent</button>
<button type="button" id="boutonsuiv" class="boutonsuiv" onFocus="this.style.borderColor=\'#33CCFF\';" onBlur="this.style.borderColor=\'#000000\';">mois suivant</button>

Morceau de javascript à rajouter à la fin de ton fichier du formulaire,

[javascript]
<script>
//Ajout d'évènement javascript aux bouton suivant et précédent (équivalent de onclick="")
document.getElementById('boutonprec').addEventListener('click',function() { getAJAXmois(document.getElementById('date_id_annee-mois').value,-1) }, false);
document.getElementById('boutonsuiv').addEventListener('click',function() { getAJAXmois(document.getElementById('date_id_annee-mois').value,1) }, false);
</script>
[/javascript]

Ta fonction ajax getAJAXmois : (tu envois le résultat prélever avant)

[javascript]
function getAJAXmois (periode,operation) {
var xhr = Ajax();

xhr.open("POST", "tonfichiercible.php", true); //Sa peut être GET aussi
xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
xhr.send("operation=" + operation + "&periode=" + periode);

xhr.onreadystatechange = function() { ... } //après la mise à jour du div output avec le résultat de l'ajax

}
[/javascript]

Ton script php pour l'ajax:
//tes fonctions utiles

//ta fonction showCalendar

if (!empty($_POST['operation']) && !empty($_POST['periode'])) {

   //extraction des variables
   $periode = htmlentities($_POST['periode']);
   $month = getMonth($periode);
   $year = getYear($periode);
   $operation = $month + htmlentities($_POST['operation']); 

   //Calcul de la période après modification du mois
   $periode = date("Y-m-d",mktime(0,0,0,$operation,1,$year));

   //Affichage de la réponse pour ajax: calendrier + champs hidden (utile pour le formulaire ET l'ajax)
   showCalendar($periode);
   echo '<input type="hidden" name="date_id_annee_mois" id="date_id_annee-mois" value="',$year,'-',$month,'" />
           <input type="hidden" name="date_id_jour" id="date_id_jour" value="01" />';
}

Re: Faire un calendrier.

par sirakawa » 04 sept. 2014, 13:10

Oui, j'ai confondu avec la question d'un autre qui a un seul id (1) et à chaque consultation fait un insert id =1

Re: Faire un calendrier.

par toytoy » 04 sept. 2014, 10:28

1) Je parlais de l'id utilisateur qui (cf début) est unique.
Je crois que j'ai pas compris ce que tu voulais dire, mais si il y a plusieurs utilisateurs on ne peut pas le mettre en "dur" dans le code, dans notre cas on est obliger d'avoir recours à $_SESSION (la tableu user ou on a tous nos utilisateurs, et la référence dans la table reservation qui attribue les reservation pour les utilisateur je vois pas comment tu veux faire autrement :roll: )