8722 sujets

Développement web côté serveur, CMS

Bonjour à tous,

J'ai un gros soucis pour afficher un tableau sous forme de calendrier.

Tout d'abord, voici l'adresse du calendrier qui pose problème :
[URL="http://bit.ly/11NgTxm"]
http://bit.ly/11NgTxm
[/URL]
Ce qui fonctionne :

- Quand la page charge la première fois, le calendrier fonctionne parfaitement

- Quand on change la valeur de l'année dans la liste déroulante :

- Le mois de janvier n'est pas affiché

- Le calendrier n'est pas correct, il reste toujours sur 2013

J'ai affiché avec un print_r le tableau qui est parcouru pour générer le calendrier, ce tableau contient les données correctes.

Le problème est que le tableau n'est pas affiché correctement sous forme de calendrier.

Sur le change de la liste déroulante, j'exécute ce code :

$('#sel_annee').change(function()
               {
                  $('.month').hide();
                  $('.month:first').show();
                  $('.months a:first').addClass('active');
                  var current = 1;
                              $.ajax({
                                 type: 'post',
                                 url: 'changer_annee.php',
                                 data:
                                 {
                                    year:$('#sel_annee').val()
                                 },
                                 dataType: 'text',
                                 success: function(retour_php)
                                 {
                                    console.log(retour_php);
                                   $('#afficher_annee').html($('#sel_annee').val());
                                   $('#tab_cal').html(retour_php);
                                 },
                                 error: function(retour_php)
                                 {
                                    alert("pas ok");
                                    alert(retour_php);
                                 }
                                 
                              }
                              );
               });



La page PHP appelée est celle-ci :

<?php

   require('date.php');
   $date = new Date();
   if(!isset($_POST['year']))
   {
       $year = date('Y');
   }
   else
   {
       $year = $_POST['year'];
   }

   //$events = $date->getEvents($year);
   $dates = $date->getAll($year);
   print_r($dates);
   $retour = "";
   //current — Retourne l'élément courant du tableau
   $dates = current($dates);
   $i=0;
   //$m ce sont les mois
   foreach ($dates as $m=>$days)
   {
      $retour .= '<thead><tr>';
      
      foreach ($date->days as $d)
      {
         //$i++;
         //echo $i."";
         //echo $d.'<br />';
           $retour.= '<th>'.substr($d,0,3).'</th>';
      }
      $retour .= '</tr></thead>';
      //echo $retour;
      //return false;
      $retour .= '<tbody><tr>';
      //end — Positionne le pointeur de tableau en fin de tableau
      $end = end($days);
      foreach($days as $d=>$w)
      {
          $time = strtotime("$year-$m-$d");
          
          //fusion des cellules au cas où le premier jour du mois ne commence pas un lundi
          if($d == 1 && $w != 1)
          {
             $retour.= '<td colspan="'.($w-1).'" class="padding"></td>';
          }
          $retour.= '<td>';
          //echo $d .'d <br />';
          //echo $w . 'w <br />';
          if($time == strtotime(date('Y-m-d')))
          {
             $retour.= ' class="today" >';
          }
          $retour.= '<div class="relative">';
          $retour.= '<div class="day">'.$d.'</div>';
          $retour.= '</div><div class="daytitle">'; 
              
         $retour .= $date->days[$w-1];
         $retour .= $d;
         $retour .= $date->months[$m-1];
         $retour.= '</div></td>';
         if($w == 7)
         {
           $retour.= '</tr><tr>';
         }
      } //fin du foreach($days as $d=>$w)
      if($end != 7)
      {
         $retour .= '<td colspan="'.(7-$end).'" class="padding"></td>';
      }
      $retour.= '</tr>';
      $retour.= '</tbody>';
      $retour.='</table>';
      $retour.='</div>';
   } //fin du foreach ($dates as $m=>$days)
   
   $retour.='</div>';
   
   echo $retour;

?>



pour l'année 2012, j'ai par exemple ce tableau (un peu long car 12 mois) : 1 (lundi) 7 (dimanche)

a écrit :
Array
(
Array
(
[2012] => Array
(
[1] => Array
(
[1] => 7
[2] => 1
[3] => 2
[4] => 3
[5] => 4
[6] => 5
[7] => 6
[8] => 7
[9] => 1
[10] => 2
[11] => 3
[12] => 4
[13] => 5
[14] => 6
[15] => 7
[16] => 1
[17] => 2
[18] => 3
[19] => 4
[20] => 5
[21] => 6
[22] => 7
[23] => 1
[24] => 2
[25] => 3
[26] => 4
[27] => 5
[28] => 6
[29] => 7
[30] => 1
[31] => 2
)

[2] => Array
(
[1] => 3
[2] => 4
[3] => 5
[4] => 6
[5] => 7
[6] => 1
[7] => 2
[8] => 3
[9] => 4
[10] => 5
[11] => 6
[12] => 7
[13] => 1
[14] => 2
[15] => 3
[16] => 4
[17] => 5
[18] => 6
[19] => 7
[20] => 1
[21] => 2
[22] => 3
[23] => 4
[24] => 5
[25] => 6
[26] => 7
[27] => 1
[28] => 2
[29] => 3
)


[12] => Array
(
[1] => 6
[2] => 7
[3] => 1
[4] => 2
[5] => 3
[6] => 4
[7] => 5
[8] => 6
[9] => 7
[10] => 1
[11] => 2
[12] => 3
[13] => 4
[14] => 5
[15] => 6
[16] => 7
[17] => 1
[18] => 2
[19] => 3
[20] => 4
[21] => 5
[22] => 6
[23] => 7
[24] => 1
[25] => 2
[26] => 3
[27] => 4
[28] => 5
[29] => 6
[30] => 7
[31] => 1
)

)

)


Le texte qui vient se mettre dans le table est celui-ci :

<thead><tr><th>Lun</th><th>Mar</th><th>Mer</th><th>Jeu</th><th>Ven</th><th>Sam</th><th>Dim</th></tr></thead><tbody><tr><td colspan="1" class="padding"></td><td><div class="relative"><div class="day">1</div></div><div class="daytitle">Mardi1</div></td><td><div class="relative"><div class="day">2</div></div><div class="daytitle">Mercredi2</div></td><td><div class="relative"><div class="day">3</div></div><div class="daytitle">Jeudi3</div></td><td><div class="relative"><div class="day">4</div></div><div class="daytitle">Vendredi4</div></td><td><div class="relative"><div class="day">5</div></div><div class="daytitle">Samedi5</div></td><td><div class="relative"><div class="day">6</div></div><div class="daytitle">Dimanche6</div></td></tr><tr><td><div class="relative"><div class="day">7</div></div><div class="daytitle">Lundi7</div></td><td><div class="relative"><div class="day">8</div></div><div class="daytitle">Mardi8</div></td><td><div class="relative"><div class="day">9</div></div><div class="daytitle">Mercredi9</div></td><td><div class="relative"><div class="day">10</div></div><div class="daytitle">Jeudi10</div></td><td><div class="relative"><div class="day">11</div></div><div class="daytitle">Vendredi11</div></td><td><div class="relative"><div class="day">12</div></div><div class="daytitle">Samedi12</div></td><td><div class="relative"><div class="day">13</div></div><div class="daytitle">Dimanche13</div></td></tr><tr><td><div class="relative"><div class="day">14</div></div><div class="daytitle">Lundi14</div></td><td><div class="relative"><div class="day">15</div></div><div class="daytitle">Mardi15</div></td><td><div class="relative"><div class="day">16</div></div><div class="daytitle">Mercredi16</div></td><td><div class="relative"><div class="day">17</div></div><div class="daytitle">Jeudi17</div></td><td><div class="relative"><div class="day">18</div></div><div class="daytitle">Vendredi18</div></td><td><div class="relative"><div class="day">19</div></div><div class="daytitle">Samedi19</div></td><td><div class="relative"><div class="day">20</div></div><div class="daytitle">Dimanche20</div></td></tr><tr><td><div class="relative"><div class="day">21</div></div><div class="daytitle">Lundi21</div></td><td><div class="relative"><div class="day">22</div></div><div class="daytitle">Mardi22</div></td><td><div class="relative"><div class="day">23</div></div><div class="daytitle">Mercredi23</div></td><td><div class="relative"><div class="day">24</div></div><div class="daytitle">Jeudi24</div></td><td><div class="relative"><div class="day">25</div></div><div class="daytitle">Vendredi25</div></td><td><div class="relative"><div class="day">26</div></div><div class="daytitle">Samedi26</div></td><td><div class="relative"><div class="day">27</div></div><div class="daytitle">Dimanche27</div></td></tr><tr><td><div class="relative"><div class="day">28</div></div><div class="daytitle">Lundi28</div></td><td><div class="relative"><div class="day">29</div></div><div class="daytitle">Mardi29</div></td><td><div class="relative"><div class="day">30</div></div><div class="daytitle">Mercredi30</div></td><td><div class="relative"><div class="day">31</div></div><div class="daytitle">Jeudi31</div></td></tr></tbody></table></div></div>



Je vous remercie d'avance pour votre aide.

bee
Bonjour,

Ton code html "retour_php" à l'air mal formaté. Il y a "</table></div></div>" en trop.
ton code est un peu barbare O.o
pour les semaines par exemple :
1 = 2
2 = 3
4 = 5
5 = 6
6 = 7
7 = 8

et bien voilà un truc qui vas changer ta vie (ou presque )
9%7 = 2 voilà un modulo, ça te donne le reste d'une division d'euclide.
benj a écrit :
Bonjour,

Ton code html &quot;retour_php&quot; à l'air mal formaté. Il y a &quot;&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;&quot; en trop.


Salut,

Merci pour ta réponse qui me permet d'avancer.

Le mois de janvier s'affiche maintenant correctement.

Tous les mois sont les uns en dessous des autres, les mois sont corrects, mais devraient être cachés (à l'exception du premier).

Quand j'appuie sur un autre mois, les jours ne sont plus corrects, le 13 février 2012 devrait tomber un lundi, mais tombe un mercredi, quelque soit l'année.

Je mets à la disposition de tout le monde un lien qui permet de télécharger le code source (rar), ce site n'est pas lié à une bd.

Merci encore pour l'aide.
ilar a écrit :
ton code est un peu barbare O.o
pour les semaines par exemple :
1 = 2
2 = 3
4 = 5
5 = 6
6 = 7
7 = 8

et bien voilà un truc qui vas changer ta vie (ou presque )
9%7 = 2 voilà un modulo, ça te donne le reste d'une division d'euclide.


Salut,

Merci pour ta réponse.

Je mets où ton code ?

Encore merci.

bee
beegees a écrit :

Je mets où ton code ?


Nulle part, dans ton cas, un modulo fonctionnerai si tous les 1er janvier étaient un lundi. Ce qui n'est pas le cas.

Tu devrais regarder du côté de la classe DateTime qui est vraiment plus puissante que la fonction date(). Elle permet de faire de manipulations et de calculs sur les dates de manières très simples.

Par exemple si tu veux connaître le jour (Lundi, Mardi...) d'une date précise tu fais juste :


$date = new DateTime();
$date->setDate(2012, 1, 30);
echo $date->format('N');

// Affiche 1 pour Lundi.

Modifié par jb_gfx (28 Mar 2013 - 10:09)