script de calendrier avec cases a cocher

script de calendrier avec cases a cocher - PHP - Programmation

Marsh Posté le 08-11-2005 à 14:25:01    

Bonjour,
 
voila, j'ai adapté ce script que j'ai pompé dans un bouquin (PHP5 O'Reilly).
Il affiche un calendrier mensuel selon la selection du mois et de l'annee dans 2 listes deroulantes.
j'ai ajouté une case à cocher par jour du mois, pour que l'utilisateur puisse cocher les jours qu'il souhaite reserver.
j'ai donc ajouté un bouton enregistrer, qui normalement devrait sauvegarder la selection dans la DB MySQL.
malheureusement, la methode que j'utilise pour parcourir le tableau de cases a cocher n'a pas l'air de fonctionner.  
Mais je ne sais pas a quel niveau se situe l'erreur de logique.
 
merci d'avance a qui pourra m'aider !
 
la fonction que j'ai modifié est process_form() vers la ligne 72
 
 

Code :
  1. <?php
  2. // Use the form helper functions defined in Chapter 6
  3. require 'formhelpers.php';
  4. $months = array(1 => 'January', 2 => 'February', 3 => 'March', 4 => 'April',
  5.                 5 => 'May', 6 => 'June', 7 => 'July', 8 => 'August',
  6.                 9 => 'September', 10 => 'October', 11 => 'November',
  7.                 12 => 'December');
  8. $years = array();
  9. for ($year = date('Y') - 1, $max_year = date('Y') + 5; $year < $max_year; $year++) {
  10.     $years[$year] = $year;
  11. }
  12. if ($_POST['_submit_check']) {
  13.     if ($errors = validate_form()) {
  14.         show_form($errors);
  15.     } else {
  16.         show_form();
  17.         process_form();
  18.     }
  19. } else {
  20.     // When nothing is submitted, show the form and then
  21.     // a calendar for the current month
  22.     show_form();
  23.     show_calendar(date('n'), date('Y'));
  24. }
  25. function validate_form() {
  26.     global $months, $years;
  27.     $errors = array();
  28.     if (! array_key_exists($_POST['month'], $months)) {
  29.         $errors[] = 'Select a valid month.';
  30.     }
  31.     if (! array_key_exists($_POST['year'], $years)) {
  32.         $errors[] = 'Select a valid year.';
  33.     }
  34.     return $errors;
  35. }
  36. function show_form($errors = '') {
  37.     global $months, $years, $this_year;
  38.     // If the form is submitted, get defaults from submitted variables
  39.     if ($_POST['_submit_check']) {
  40.         $defaults = $_POST;
  41.     } else {
  42.         // Otherwise, set our own defaults: the current month and year
  43.         $defaults = array('year' => date('Y'),
  44.                           'month' => date('n'));
  45.     }
  46.     if ($errors) {
  47.         print 'You need to correct the following errors: <ul><li>';
  48.         print implode('</li><li>',$errors);
  49.         print '</li></ul>';
  50.     }
  51.     print '<form method="POST" action="'.$_SERVER['PHP_SELF'].'">';
  52.     input_select('month', $defaults, $months);
  53.     input_select('year',  $defaults, $years);
  54.     input_submit('Afficher','Afficher');
  55.     input_submit('Enregistrer','Enregistrer');
  56.     print '<input type="hidden" name="_submit_check" value="1"/>';
  57.     print '</form>';
  58. }
  59. function process_form() {
  60.     // si on a clicke sur afficher
  61.     if (isset($_POST['Afficher'])) {
  62.     show_calendar($_POST['month'], $_POST['year']);
  63.     }
  64.     //sinon, verifier si des dates ont ete selectionnees
  65.     //si oui, enregistrer dans la DB
  66.     //sinon, rien faire
  67.    if (isset($_POST['Enregistrer'])) {
  68.        foreach($_POST['mycheckbox'] as $value){
  69.            echo 'test';
  70.            echo "<BR> You clicked checkbox number " .$value, "\n";
  71.        }
  72.    }
  73. }
  74. function show_calendar($month, $year) {
  75.     global $months;
  76.     $weekdays = array('Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa');
  77.     // Find the epoch timestamp for midnight on the first day of the month
  78.     $first_day = mktime(0,0,0,$month, 1, $year);
  79.     // How many days are in the month?
  80.     $days_in_month = date('t', $first_day);
  81.     // What day of the week (numerically) is the first day of the month?
  82.     // You need this to put the first table cell in the right place
  83.     $day_offset = date('w', $first_day);
  84.     // Print the table header and the row of weekday names
  85.     print<<<_HTML_
  86. <table border="0" cellspacing="0" cellpadding="2">
  87. <tr><th colspan="7">$months[$month] $year</th></tr>
  88. <tr><td align="center">
  89. _HTML_;
  90.     print implode('</td><td align="center">', $weekdays);
  91.     print '</td></tr>';
  92.     // If the first day of the month is, say, a Tuesday, then you
  93.     // need to put blank table cells under "Su" and "Mo" in the first
  94.     // row so that the day 1 table cell goes under "Tu"
  95.     if ($day_offset > 0) {
  96.         for ($i = 0; $i < $day_offset; $i++) { print '<td>&nbsp;</td>'; }
  97.     }
  98.     // Print a table cell for each day of the month
  99.     for ($day = 1; $day <= $days_in_month; $day++ ) {
  100.         print '<td align="center">' . $day ;
  101.         input_radiocheck('checkbox','mycheckbox[]', $_POST, $day);
  102.         print  '</td>';
  103.         $day_offset++;
  104.         // If this cell was the seventh in the row, then
  105.         // end the table row and reset $day_offset
  106.         if ($day_offset == 7) {
  107.             $day_offset = 0;
  108.             print "</tr>\n";
  109.             // If there are more days to come, then
  110.             // start a new table row
  111.             if ($day < $days_in_month) {
  112.                 print '<tr>';
  113.             }
  114.         }
  115.     }
  116.     // At this point, one table cell has been printed for each day
  117.     // of the month. If the last day of the month isn't a Saturday
  118.     // then the last row of the table needs to be padded with
  119.     // some blank cells out to the end of the row
  120.     if ($day_offset > 0) {
  121.         for ($i = $day_offset; $i < 7; $i++) {
  122.             print '<td>&nbsp;</td>';
  123.         }
  124.         print '</tr>';
  125.     }
  126.     print '</table>';
  127. }
  128. ?>


---------------
L'homme de bien ne demande rien qu'à lui-même ; l'homme de peu demande tout aux autres. - Confucius
Reply

Marsh Posté le 08-11-2005 à 14:25:01   

Reply

Marsh Posté le 08-11-2005 à 14:40:03    

Regarde le code que ça génère, je suis sur que tu verras un truc qui me chifonne :D

Reply

Marsh Posté le 08-11-2005 à 15:03:39    

tu veux dire le code quand j'ouvre la page, quand je clique sur Afficher ou quand je clique sur Enregistrer ?
 
Edit: je precise que je n'ai pas encore codé l'enregistrement dans la DB !
J'essaie pour l'instant de capter quelles cases ont été cochées .


Message édité par friday_13 le 08-11-2005 à 15:05:10

---------------
L'homme de bien ne demande rien qu'à lui-même ; l'homme de peu demande tout aux autres. - Confucius
Reply

Marsh Posté le 08-11-2005 à 15:09:35    

Oui c'est cela ;) T'a vérifier la source html générée? Sinon C'est $_POST[] qu'il faut dérouler ;)

Reply

Marsh Posté le 08-11-2005 à 15:32:03    

désolé, mais je ne comprends pas ta réponse :)
 
la fonction ne rentre pas dans cette boucle  
 
#        foreach($_POST['mycheckbox'] as $value){
#            echo 'test';
#            echo "<BR> You clicked checkbox number " .$value, "\n";
#        }
#    }
 
 


---------------
L'homme de bien ne demande rien qu'à lui-même ; l'homme de peu demande tout aux autres. - Confucius
Reply

Marsh Posté le 08-11-2005 à 15:56:20    

Si tu le dis alors... Je me suis pas attarder plus que ça :D

Reply

Marsh Posté le 08-11-2005 à 16:12:35    

Ok, je vois  :sarcastic:


---------------
L'homme de bien ne demande rien qu'à lui-même ; l'homme de peu demande tout aux autres. - Confucius
Reply

Marsh Posté le 08-11-2005 à 17:43:32    

Salut,
 
je pense pas que php comprenne "foreach($_POST['mycheckbox'] as $value)", je crois que pour verifier si une case a été cochée t'aies besoin de isset.
 
moi je ferais comme ca:
pour chaque checkbox, crée un nom avec un chiffre checkbox1, checkbox2....checkboxn
 
ensuite vérifie la validité de chaque checkbox comme ca:
 
for($i=1;$i<=nombre de checkbox;$i++)
     {//génère le nom de ta checkbox
      $name="checkbox"."$i";
      if(isset($_POST[$name]))
        {
         echo "<BR> You clicked checkbox number " .$i, "\n";
        }
     }
 
Voilà j'espère que ca peux t'aider.
++

Reply

Marsh Posté le 08-11-2005 à 18:08:40    

protoss_tth a écrit :

Salut,
 
je pense pas que php comprenne "foreach($_POST['mycheckbox'] as $value)", je crois que pour verifier si une case a été cochée t'aies besoin de isset.
 
moi je ferais comme ca:
pour chaque checkbox, crée un nom avec un chiffre checkbox1, checkbox2....checkboxn
 
ensuite vérifie la validité de chaque checkbox comme ca:
 
for($i=1;$i<=nombre de checkbox;$i++)
     {//génère le nom de ta checkbox
      $name="checkbox"."$i";
      if(isset($_POST[$name]))
        {
         echo "<BR> You clicked checkbox number " .$i, "\n";
        }
     }
 
Voilà j'espère que ca peux t'aider.
++

[:sprint] Ca utilise une méthode pareille et ca ose la conseiller en laissant entendre que l'autre méthode ne risque pas de marcher? [:sprint]  
Une checkbox en

Code :
  1. $name="checkbox[]"

et le tour est joué. Pourquoi se prendre la tête avec de trés mauvaises méthodes?
Evidement, il faut donner une valeur différente à chaque checkbox. En tout cas, le isset sera utilisé une seule fois pour vérifier qu'au moins une case a été coché et ensuite on parcourt avec le foreach pour savoir lesquelles et on perd pas notre temps à faire plusieurs disaines de tests pour une seule case coché.
 
friday_13 > Fait un

Code :
  1. print_r($_POST);

quelque part, ca t'affichera le contenu exact et intégral du tableau $_POST avec les noms de cases et companies. Ca te permettra de voir pourquoi ca marche pas comme prévus.


Message édité par omega2 le 08-11-2005 à 18:11:04
Reply

Marsh Posté le 08-11-2005 à 18:54:56    

salut
 
le resultat en HTML pour les checkbox donne ceci :
<td align="center">6<input type="checkbox" name="mycheckbox[]" value="6" />
<td align="center">7<input type="checkbox" name="mycheckbox[]" value="7" />
etc...


---------------
L'homme de bien ne demande rien qu'à lui-même ; l'homme de peu demande tout aux autres. - Confucius
Reply

Marsh Posté le 08-11-2005 à 18:54:56   

Reply

Marsh Posté le 09-11-2005 à 11:27:31    


Monsieur veut se donner de l'importance
Sous ses airs de seigneur, exprime son arrogance
Le niais brillant cependant par sa cécité
Car d'humilité, et bien, point n'en est.

-protoss_tth-

Reply

Marsh Posté le 09-11-2005 à 14:15:13    

protoss_tth a écrit :


Monsieur veut se donner de l'importance
Sous ses airs de seigneur, exprime son arrogance
Le niais brillant cependant par sa cécité
Car d'humilité, et bien, point n'en est.

-protoss_tth-


 
les mp, tu connais  :fou:


---------------
L'homme de bien ne demande rien qu'à lui-même ; l'homme de peu demande tout aux autres. - Confucius
Reply

Marsh Posté le 09-11-2005 à 15:34:53    

ouaip :p , à ce sujet, omega2 et moi même te présentons nos excuses pour le spammage intempestif du topic. :jap:
revenons à nos moutons:
Voilà qui devrait faire l'unanimité
 

Code :
  1. <?php
  2. $arr=array('checkbox1','checkbox2','checkbox3');
  3. echo "<FORM action=\"" .$_SERVER['PHP_SELF']. "\" method=\"POST\" enctype=\"text/html\">
  4.             <TABLE border=1><TR><TD><INPUT TYPE=CHECKBOX value=1 NAME=$arr[0] ></TD></TR>
  5.                             <TR><TD><INPUT TYPE=CHECKBOX value=2 NAME=$arr[1] ></TD></TR>
  6.                             <TR><TD><INPUT TYPE=CHECKBOX value=3 NAME=$arr[2] ></TD></TR>
  7.                             <TR><TD><INPUT TYPE=Submit NAME=sauver value=sauver ></TD></TR><TABLE><FORM> ";
  8. if(isset($_POST['sauver']))
  9.   {
  10.     foreach($arr as $value)
  11.     {
  12.     if(isset($_POST[$value]))
  13.     echo "cochée: checkbox $value <BR>";
  14.     }
  15.   }
  16. ?>


 
je pense qu'omega2 poussera une gueulante haut et fort si cela ne lui convient pas.
++ et   bon codage friday.

Reply

Marsh Posté le 09-11-2005 à 15:42:38    

C'est bien ça.
Avec cette méthode, il n'y a même pas besoin des 0 1 et 2 entre crochet vu que php rajoutera de lui même les indices en recevant les données si les indices ne sont pas indiqué. Mais c'est vrai qu'avec un foreach derriére, ca changera rien.
 
PS : Désolé, je suis parfois de mauvaises humeurs et quand je vois de trés mauvais conseils ca a tendance à me mettre en colére dans ces moment là.

Reply

Marsh Posté le 09-11-2005 à 16:56:57    

bon , copaings alors ? :)
 
merci pour l'aide, je teste ça ce soir et je vous dis quoi


---------------
L'homme de bien ne demande rien qu'à lui-même ; l'homme de peu demande tout aux autres. - Confucius
Reply

Marsh Posté le 17-11-2005 à 14:57:52    

bon ben j'ai honte,
en fait comme le code html du calendrier est genere apres le tag </FORM>
les checkbox n'etaient pas dans la variable $_POST, logique.
 


---------------
L'homme de bien ne demande rien qu'à lui-même ; l'homme de peu demande tout aux autres. - Confucius
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed