[RESOLU] Faire un calendrier.

Eléphant du PHP | 290 Messages

12 août 2014, 12:21

Bonjour,

Je souhaite créer un calendrier.
J'ai pris du code php déjà préparé car c'est compliqué pour
moi du tout faire tout seul et comme le code à l'air assez basique
il semble aussi assez simple à adapter selon nos besoins.

J'ai de grosses difficultés de compréhension à partir d'un certain moment,
car il y a des choses que je ne comprends vraiment pas.
Je voudrais vous poser des questions sur des points bien précis .

Je vous montre les fichiers:
<?php # fonctions utiles, $valeur 
 # représente une date au format AAAA-MM-JJ
 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";
}
?>
Ca, ça va assez bien.
Le code suivant me pose problème.
<?php
# Fonction pour afficher le calendrier
 function showCalendar($periode) {
    $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>L</li>
        \t<li>M</li>
        \t<li>M</li>
        \t<li>J</li>
        \t<li>V</li>
        \t<li>S</li>
        \t<li>D</li>
    </ul>";
	
    # Tant que l'on n'a pas affecté tous les jours du mois traité
      while ($pas < $nb_jour) {
        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]) {
          # Si jour calendrier == aujourd'hui
          $afficheJour = Date("j", 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")) {
                $class = " class=\"itemCurrentItem\"";

          }
          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) {
                    $class = " class=\"itemExistingItem\"";
                    $afficheJour = "<a href=\"\">" . Date("j",
                    mktime(0, 0, 0, getMonth($periode), 1 + 
                    $pas, getYear($periode))) . "</a>";

                     }
                     else {
                          $class = "";
                          }
                     }
                     # Ajout de la case avec la date
                     $leCalendrier .= "\n\t\t<li$class>
                     $afficheJour</li>";
                     $pas++;
             }
             #
             else {

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

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

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

     }
?>
Je suis perdu à partir du moment où on me parle des variables $pas et $indexe.
Je ne sais pas du tout qu'est-ce que c'est, à quoi elles servent et comment elles fonctionnent.
Je ne comprends donc pas non plus
1 + $pas
un peu plus loin, ni
if(1){...}
à nouveau un peu plus loin.
Quant aux liens je ne sais pas non plus de quoi il s'agit:
# un lien à chaque fois
# A vous de faire les tests 
# nécessaire si vous gérer un agenda par exemple
Si quelqu'un peut m'éclairer sur ces points ça m'avancerait beaucoup.
Le reste m'a l'air assez facile à comprendre,
mais pour ce qui est des points évoqués je ne comprends rien du tout. #-o
<style type="text/css">
calendrier.css?201208241130"css">#calendrier li{ list-style: none;	 } #libelle { width: 210px; margin: 0 auto; padding: 0; } .ligne { width: 210px; margin: 0 auto; padding: 0; } #libelle li {  float : left; width : 30px; } .ligne li { color: #000000; float : left; width : 30px; } .ligne li a:hover{ list-style: none; text-decoration: none; } li.itemCurrentItem { color: #FF0000;/* A vous de configurer l'apparence de la date du jour */ } li.itemSelectedItem { color: #093;/* A vous de configurer l'apparence du jour sélectionné */ }
</style>

Eléphant du PHP | 113 Messages

12 août 2014, 12:45

Alors voici des points qui pourront t'éclairer:

Quand il parle de lien, cela veut dire que lorsque ton aganda sera générer tu peu par exemple mettre pour le jour, un lien qui redirigerait vers une tâche (ex un RDV).
Donc le if(1) { ... } s’exécutera toujours, à toi par exemple de remplacer par une variable booléenne si tu souhaite que ce soit un aganda et pas simplement un calendrier...

$pas et $indexe sont deux variables qui s'incrémente dans le script, $pas permet de générer le calendrier jusqu'au $nb_jour qui correspond au nombre de jours dans le mois de la période que tu à choisis (voici la doc qui peut t'aider à comprendre: http://php.net/manual/fr/function.date.php)
function showCalendar($periode) {
    $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;
$indexe s'incrémente et correspond au n° du jour de la semaine, il permet de faire les retour à la ligne pour que les jours soient dans la même colonne (?)

C'est possible que je me soit trompé, j'ai vite regarder, donc si quelqu'un d'autre pouvait confirmer (ou au contraire 8-| )

Eléphant du PHP | 290 Messages

12 août 2014, 16:06

Merci, je comprends mieux et j'ai du coup pu avancer :)
J'ai par contre encore 3 questions :)
Une sur php, une en rapport avec javascript et une sur css.
Je les écris toutes dans ce message pour une question de facilité si vous n'y voyez pas d'inconvénient.

1)Je voudrais aussi savoir comment je pourrais faire en php pour que lorsque l'utilisateur appuie sur
un nombre celui-ci puisse être gardé en mémoire pour être gardé sous la forme
$_POST['ma_variable'] 

après validation du formulaire.
C'est compliqué pour moi car il y a des liens qui font que lorsqu'en tant qu'utilisateur je clique sur un nombre la page
se réactualise.
Je souhaiterais aussi, juste après, faire en sorte qu'une couleur confirme le nombre sur lequel l'utilisateur a cliqué.

2)Je voudrais par la suite faire en sorte que sur mon formulaire, l'utilisateur voit au début juste une toute petite portion
du calendrier (tout petit carré représentant le coin supérieur gauche du calendrier) et lorsqu'il clique dessus une animation javascript
fasse apparaître en diagonale (bas-droite) le calendrier comme si on le déroulait.
Je compte donc préparer un programme avec la fonction moveSprite et des constantes en js,
mais pour cela j'ai besoin dans mon programme js de faire référence à une image représentant le calendrier
(avec src="...").
Sauriez-vous comment faire pour faire de mon calendrier une image et quoi mettre dans src="..."
dans ma page js?

3)J'avais également oublié de demander, qu'est-ce que
?201208241130"css"
dans:

<style type="text/css">
calendrier.css?201208241130"css">#calendrier li{ list-style: none; } #libelle { width: 210px; margin: 0 auto; padding: 0; } .ligne { width: 210px; margin: 0 auto; padding: 0; } #libelle li { float : left; width : 30px; } .ligne li { color: #000000; float : left; width : 40px; text-decoration: none; } .ligne li a:hover{ color: #800080; list-style: none; text-decoration: none; } li.itemCurrentItem { color: #FF0000;/* A vous de configurer l'apparence de la date du jour */ } li.itemSelectedItem {/* A vous de configurer l'apparence du jour sélectionné */ }
</style>

Eléphant du PHP | 113 Messages

12 août 2014, 17:24

1) Dans ton cas puisque qu'un lien se génère dans la boucle c'est plus simple de faire passer par un $_GET, à cet endroit :
if (1) {
                    $class = " class=\"itemExistingItem\"";
                    $afficheJour = "<a href=\"\">" . Date("j",
                    mktime(0, 0, 0, getMonth($periode), 1 + 
                    $pas, getYear($periode))) . "</a>";

                     }
tu remplace par
if (1) {
                    $class = " class=\"itemExistingItem\"";
                    //la date qui sera afficher (sous forme d'un lien), si il clique dessus, sa renverra une variable par $_GET avec la valeur de la date 
                    $var = Date("j", mktime(0, 0, 0, getMonth($periode), 1 + $pas, getYear($periode)));
                    $afficheJour = "<a href=\"?date=" . $var . "\">" . $var . "</a>";

                     }
Pense à bien profiter ta variable avec htmlentities par exemple quand tu la récupéreras et de tester son existence.

2) je ne suis pas super bon en js, src= c'est la source de ton image, donc là à toi de voir ce que tu veux mettre comme ça Image ou encore Image

3) Aucune idée... En recherchant sur google j'ai pas trouver grand chose, mais je suis curieux de savoir

Eléphant du PHP | 290 Messages

12 août 2014, 18:19

Merci pour tout.

J'ai essayé avec GET, le serveur me dit:
"Notice: Use of undefined constant o - assumed 'o' in C:\xampp\htdocs\mon_site\ma_page.php on line 565
"Notice: Use of undefined constant o - assumed 'o' in C:\xampp\htdocs\mon_site\ma_page.php on line 565
"Notice: Use of undefined constant o - assumed 'o' in C:\xampp\htdocs\mon_site\ma_page.php on line 565
Warning: mktime() expects parameter 1 to be long, string given in C:\xampp\htdocs\mon_site\ma_page.php.php on line 565
Le tout répété une trentaine de fois (peut-être car il y a 31 jours dans un mois?)

Si je te redonne mon code modifié, le voici:
<?php
# Fonction pour afficher le calendrier
 function showCalendar($periode) {
    $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>L</li>
        \t<li>M</li>
        \t<li>M</li>
        \t<li>J</li>
        \t<li>V</li>
        \t<li>S</li>
        \t<li>D</li>
    </ul>";
	
    # Tant que l'on n'a pas affecté tous les jours du mois traité
      while ($pas < $nb_jour) {
        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]) {
          # 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")) {
                $class = " class=\"itemCurrentItem\"";
          }
          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) {
                    $class = " class=\"itemExistingItem\"";
                    $var = Date("d", mktime(o, o, o, getMonth($periode), 1 + $pas, getYear($periode)));
                    $afficheJour = "<a href=\"?date=" . $var . "</a>";
                    }
                     else {
                          $class = "";
                          }
                     }
                     # Ajout de la case avec la date
                     $leCalendrier .= "\n\t\t<li$class>
                     $afficheJour</li>";
                     $pas++;
             }
             #
             else {

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

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

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

     }
?>
Pour info, ce calendrier doit faire partie d'un formulaire validé avec une méthode POST.
Tu proposes donc de mettre un petit GET qui récupère une donnée dans la barre d'adresse
avant la validation du formulaire en entier, de telle manière qu'ensuite ce soit le POST
du formulaire qui récupère ce qui était récupéré par GET avant la validation?
Je n'ai jamais utilisé GET encore.
Je suppose qu'il faut annoncer la méthode quelque part comme c'est le cas avec POST, non?
N'y a-t'il pas besoin de balise input en html quelque part?
Après la validation du formulaire, quelle est censé être le nom de ma variable
$_POST['ma_variable'], ou plutôt $_GET['ma_variable'] peut-être?

Pour ce qui est de
?201208241130"css"
même si j'efface ce bout de code ça ne change rien.
Si ça se trouve c'est juste une référence sans rapport avec css ni php.

Pour ce qui est du nettoyage des données, je pense voir cela après, mais sans faute.

Eléphant du PHP | 113 Messages

12 août 2014, 18:42

$var = Date("d", mktime(o, o, o, getMonth($periode), 1 + $pas, getYear($periode)));
tu as mis des "o" au lieu de zéros "0" et oui c'est pour ça que c'est répété autant de fois, c'est dans ta boucle ;) $pas et $nb_jour, regarde la condition

Pour le formulaire je savais pas vraiment comment étais ta page et s'il était dans un form ou quoi que ce soit. Donc oui tu peux remplacer ton
 $afficheJour = "<a href=\"?date=" . $var . "</a>";
par un input
 $afficheJour = "<input type=\"submit\" name=\"tonNomTropSwagIci\" value=\"" . $var . "\"</input>";

Eléphant du PHP | 290 Messages

13 août 2014, 10:11

Merci pour tout.
Une partie du travail est faite :)

J'ai encore néanmoins quelques points obscurs:

1) Le nom que tu as donné à name
name=\"tonNomTropSawgIci\"
reprend le mois, le jour et l'année
=> d'après le code
mktime(0, 0, 0, getMonth($periode), 1 + $pas, getYear($periode))
C'est juste?

2) Maintenant, quant à la forme, il s'agit du format AAAA-MM-JJ
Mais n'y aurait -til pas une erreur dans
<?php # fonctions utiles, $valeur 
 # représente une date au format AAAA-MM-JJ
/* et juste un peu plus loin */
  function getDay($valeur)     {
     return substr($valeur, 8, 2);
  }

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

  function getYear($valeur) {
     return substr($valeur, 0, 4);
 }
Ce ne serait pas un 7 à la place du 8?
Je me demande s'il n'y aurait pas une coquille.

3)la variable à récupérer dans ma page de traitement de formulaire sera
$_GET['tonNomTropSawgIci']

à côté des autres variables
$_POST['ma_variable1'], $_POST['ma_variable2'], ... $_POST['ma_variableN'],...
?

4)Lors de la création de ma table en SQL, le nom de la ligne correspondant à
$_GET['tonNomTropSawgIci']
sera
tonNomTropSwagIci date (8) NOT NULL,
c'est bien ça?

5)Lorsque l'utilisateur choisit une date dans le formulaire ça rafraîchit la page.
C'est sûrement dû au lien.
Je pense que la solution c'est de mettre des
<?php @$_POST['ma_variableX'] ?>
dans chaque champs pour value="..."
de manière à ce que les données déjà tapées restent dans la mémoire vive de l'ordinateur.
Je ne dis pas de bêtises?
A ce propos, puisque ça concerne mon cas, comment ça se passe pour les cases à cocher, les cases d'option
et les listes déroulantes qui demandent déjà à ce qu'on écrive une valeur, ce qui ne laisse plus de place pour le
<?php @$_POST['ma_variableX'] ?>
?
Je pense que tu comprends ma question.
Le rafraîchissement de la page fait que l'utilisateur se trouve alors tout en haut de la page
du formulaire et doit alors descendre vers le bas de la page pour retrouver là où il en était
juste derrière le calendrier.
Serait-ce possible de faire en sorte qu'il n'ait pas à redescendre exprès?
C'est pas absolument indispensable mais mieux :)

6)A propos de la barre d'adresse avec GET, lorsque je clique sur un jour dans le calendrier les autres données
déjà rentrées dans d'autres champs de formulaire s'accolent aussi derrière l'adresse selon le principe de GET.
Je pensais que le GET prendrait uniquement en compte la donné afférente au calendrier.
Que va-il advenir si la méthode de mon formulaire est POST?

Eléphant du PHP | 290 Messages

13 août 2014, 10:31

J'ai aussi quelques questions sur les css mais je vais les poser à l'endroit dédié aux CSS sur le forum.

Eléphant du PHP | 113 Messages

13 août 2014, 12:35

1) Tu lui donne le name que tu veux bien entendue. Submit va valider ton formulaire, et sa valeur sera bien le mktime. Il s'agit bien entendue d'une méthode POST

2) Non c'est juste, il n'y a pas de coquille. 8 signifie qu'il va trancher à partir du 8ème caractère. Je t'invite à voir sur la doc php cette fonction.

3) Non puisque tu m'as dis que tu avais déjà un formulaire avant, donc on utilise un input type submit (voir 1). Tu récupéreras via la méthode POST.

4) tu peux donner le nom que tu veux à ton champ de ta bdd. Il faut que ce soit clair pour toi. Il n'y pas besoin que ça est le même nom que ton champ dans ton code. (Dis moi clairement comment tu imagines ta table et ce que tu veux faire avec)

5) oui tu peux remettre le POST dans les value, pense donc bien à vérifier qu'ils existes ! (via la fonction isset ou empty voir doc ).

Pour ce qui est des formulaires je t'invite à voir des sujets ou des sites qui en parleront plus clairement et en détails. Mais pour une liste déroulante c'est :
<select>
   <option value="1">Un</option>
   <option value="2">Deux</option>
</select>
Le 1er option sera la valeur par défaut.

les checkbox et radio ont aussi des values. Pour des radio, par exemple le cas du choix d'un sexe, tu leur donnera le même name, mais avec des value différente (homme/femme).

Pour que tu te retrouves en bas de page après validation de ton formulaire il te suffit de mettre dans le action de ton post #pieds et que tu rajoute une div avec un id pieds en bas de page

6) il faudrait que vois ton code pour comprendre ^^

Eléphant du PHP | 290 Messages

13 août 2014, 14:33

Si je peux repredre mes questions:

1)Tu as donné à name le nom
name=\"tonNomTropSawgIci\"
Je comprends bien que tu as choisi le nom que tu veux, qu'on peut en choisir un autre.
Mais pour rester dans ton exemple, la valeur après validation sera
$_POST['tonNomTropSawgIci']

c'est bien ça?
Merci pour les autres réponses à cette question.

2 OK
3) OK
4) OK

5) Je me suis sûrement pas très bien exprimé concernant cette question.
J'utilise
<?php echo @$_POST['ma_variableX'] ?>
dans mes champs
de formulaire pour garder les données déjà tapées dans la mémoire vive de l'ordinateur.
Tu es d'accord que je mets ça dans value="..."
Je dis donc bien que j'ai besoin de cet attribut pour faire ça.

Hors l'attribut value n'est pas disponible avec les cases à cocher, les cases d'option et
les listes déroulantes car
-avec les cases d'options j'utilise déjà value pour écrire le texte qui sera à côté des petits ronds.
-avec les cases à cocher j'utilise déjà value pour écrire le texte qui sera à côté des petits carrés.
-avec les listes déroulante j'utilise value dans chaque élément option pour écrire le texte placé à un endroit de la liste.
Donc avec ces trois types de champs l'attribut value n'est plus disponible pour y mettre
<?php echo @$_POST['ma_variableX'] ?>
sachant que cette portion de code php doit elle-aussi se trouver dans l'attribut value.
Tu comprends ma question?

6)
Je réécris ma question:
A propos de la barre d'adresse avec GET, lorsque je clique sur un jour dans le calendrier les autres données
déjà rentrées dans d'autres champs de formulaire s'accolent aussi derrière l'adresse selon le principe de GET.
Je pensais que le GET prendrait uniquement en compte la donné afférente au calendrier.
Que va-il advenir si la méthode de mon formulaire est POST?

Mon code:
Première partie:
<?php # fonctions utiles, $valeur 
 # représente une date au format AAAA-MM-JJ
 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";
}
?>

Deuxième partie:
<?php
# Fonction pour afficher le calendrier
function showCalendar($periode) {
$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>L</li>
\t<li>M</li>
\t<li>M</li>
\t<li>J</li>
\t<li>V</li>
\t<li>S</li>
\t<li>D</li>
</ul>";

# Tant que l'on n'a pas affecté tous les jours du mois traité
while ($pas < $nb_jour) {
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]) {
# 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")) {
$class = " class=\"itemCurrentItem\"";
}
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) {
$class = " class=\"itemExistingItem\"";
$var = Date("d", mktime(0, 0, 0, getMonth($periode), 1 + $pas, getYear($periode)));
$afficheJour = "<input type=\"submit\" name=\"tonNomTropSawgIci\" value=\"" . $var . "\"</input>";
}
else {
$class = "";
}
}
# Ajout de la case avec la date
$leCalendrier .= "\n\t\t<li$class>
$afficheJour</li>";
$pas++;
}
#
else {

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

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

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

}
?>
Troisième partie:
<?php
echo showCalendar (date("Y-m"));
?>
Quatrième partie:
<style type="text/css">
calendrier.css?201208241130"css">#calendrier li{ list-style: none; } # calendrier ul li {list-style-type: none;} #libelle { width: 210px; margin: 0 auto; padding: 0; } .ligne { width: 210px; margin: 0 auto; padding: 0; } #libelle li {  float : left; width : 30px; } .ligne li { color: transparent; float : left; width : 40px; } .ligne li a:hover{ color: #800080; list-style: none; text-decoration: none; } li.itemCurrentItem { color: #FF0000;/* A vous de configurer l'apparence de la date du jour */ } li.itemSelectedItem { color: #0099FF;/* A vous de configurer l'apparence du jour sélectionné */ } li.itemExistingItem { color: transparent; }
</style>

Eléphant du PHP | 290 Messages

13 août 2014, 14:37

J'ai oublié le bbcode des 2me et 3ème parties:

Deuxième partie:
<?php
# Fonction pour afficher le calendrier
function showCalendar($periode) {
$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>L</li>
\t<li>M</li>
\t<li>M</li>
\t<li>J</li>
\t<li>V</li>
\t<li>S</li>
\t<li>D</li>
</ul>";

# Tant que l'on n'a pas affecté tous les jours du mois traité
while ($pas < $nb_jour) {
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]) {
# 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")) {
$class = " class=\"itemCurrentItem\"";
}
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) {
$class = " class=\"itemExistingItem\"";
$var = Date("d", mktime(0, 0, 0, getMonth($periode), 1 + $pas, getYear($periode)));
$afficheJour = "<input type=\"submit\" name=\"tonNomTropSawgIci\" value=\"" . $var . "\"</input>";
}
else {
$class = "";
}
}
# Ajout de la case avec la date
$leCalendrier .= "\n\t\t<li$class>
$afficheJour</li>";
$pas++;
}
#
else {

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

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

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

}
?>
Troisième partie:
<?php
echo showCalendar (date("Y-m"));
?>

Eléphant du PHP | 113 Messages

13 août 2014, 17:22

1) Oui c'est exactement ça.

5) Si j'ai bien compris, tu as par exemple le cas du choix du sexe, l'utilisateur à choisi homme, il valide, tu veux que homme sois coché ? Pour celà tu vérifie si $_POST['sexe'] == "homme", si oui alors met l'attribut checked en plus. (identique pour les radio et checkbox)
Par contre pour les listes déroulantes j'ai pas compris... Tu peux toujours mettre que le 1er élément sera celui choisis au préalable (du coup il serait 2fois dans la liste mais il ne compte qu'à toi même d'enlever l'autre, c'est facile à faire)

6) Si ton formulaire est en POST, tous les input, select, et autres champs de saisies seront en POST. Les GET tu les as par exemple en renvoyant un lien de cette façon, <a href="mapage.php?var1=blabla&var2=true&var3=yolo&..."

Eléphant du PHP | 290 Messages

14 août 2014, 09:14

Bonjour,

Pour la question 5, non, je ne voulais pas dire ça.
Je ne parle pas de la sélection par défaut
checked="checked"
Ce dont je parle, c'est de la mémorisation "temporaire", "en mémoire vive"
d'éléments de champs déjà postés pour le cas où l'utilisateur venait à
se retrouver pour une raison ou pour une autre sur le même formulaire
(par exemple il a oublié de saisir certains champs, a effectué la validation du formulaire
et un lien le renvoit sur le formulaire pour le compléter et/ou apporter des
modifications). S'il se retrouve à devoir apporter des modifications au formulaire,
il n'apprécierait pas de devoir retapé les données correctement saisies la première fois.
C'est pourquoi je veux utiliser
<?php echo @$_POST['ma_variableX'] ?>
J'écris cette portion de code dans l'attribut value="..." de mon champs de formulaire.
Exemple pour un simple bouton:
Prénom: <input type="text" name="nom" />
devient =>
Prénom: <input type="text" name="nom" value="<?php echo @$_POST['name'] ?>" />
Pour ce qui est de ton exemple,
j'ai
Sexe:<input type="radio" name="gender" value"homme"/>homme
       <input type="radio" name="gender" value"femme"/>femme
J'ai dans le cas des cases d'options, des cases à cocher et des listes déroulantes, comme c'est
le cas ici (cases d'options en l'occurence) plusieurs cases value à modifier et non une.
Faut-il que j'apporte mon code php dans chacun des champs value comme ceci =>
Sexe:<input type="radio" name="gender" value"<?php echo @$_POST[homme'] ?>"/>homme
       <input type="radio" name="gender" value"<?php echo @$_POST['femme'] ?>"/>femme
C'est ça ma question.
C'est juste que ça me paraît étrange, peut-être simplement nouveau, de reprendre à chaque
fois ma portion de code php pour chacun de mes attribut value du champs sur lequel je travail.

Concernant la question 6, je vais d'abord terminer ma page de traitement de formulaire et voir ce que ça donne.

Merci encore.

Eléphant du PHP | 113 Messages

14 août 2014, 17:36

C'est ce que j'essaie de te faire comprendre depuis le début, faisons clair:

voici un formulaire pris au hassard, avec les modifs en php pour que lorsqu'il manque une donnée ou qu'il y a une erreur, les valeurs entrés soient déjà dans inscrites dans le formulaire:
<form action="#" method="post">

   <label for="nom">Nom :</label>
   <input type="text" id="nom" name="nom" placeholder="Nom" value="<?php if (isset($_POST['nom'])) echo $_POST['nom']; ?>"/>
   
   <label for="prenom">Prénom :</label
   <input type="text" id="prenom" name="prenom" placeholder="Prénom" value="<?php if (isset($_POST['prenom'])) echo $_POST['prenom']; ?>"/>	

   <label for="sexe">Sexe :</label>
      <?php 
         if (isset($_POST['sexe']) && $_POST['sexe']==1) {
            echo '<label for="masculin">Homme :</label>
                    <input type="radio" id="masculin" name="sexe" value=1 checked />	
                    <label for="feminin">Femme :</label>
                    <input type="radio" id="feminin" name="sexe" value=2 />';
         } elseif ($_POST['sexe]==2) {
            echo '<label for="masculin">Homme :</label>
                    <input type="radio" id="masculin" name="sexe" value=1 />	
                    <label for="feminin">Femme :</label>
                    <input type="radio" id="feminin" name="sexe" value=2 checked />';
         } else {
            echo '<label for="masculin">Homme :</label>
                    <input type="radio" id="masculin" name="sexe" value=1 />	
                    <label for="feminin">Femme :</label>
                    <input type="radio" id="feminin" name="sexe" value=2 />';
         }
      ?>

   <label for="pseudo">Pseudo :</label>
   <input type="text" id="pseudo" name="pseudo" placeholder="Pseudo" value="<?php if (isset($_POST['pseudo'])) echo $_POST['pseudo']; ?>"/>	

   <label for="mdp">Mot de passe :</label>
   <input type="password" id="mdp" name="mdp" placeholder="•••••••••••" />
   
   <label for="mdpconfirm">Confirmation :</label>
   <input type="password" id="mdpconfirm" name="mdpconfirm" placeholder="•••••••••••"  />

   <label for="mail">Adresse mail :</label>
   <input type="mail" id="mail" name="mail" placeholder="[email protected]" value="<?php if (isset($_POST['mail'])) echo $_POST['mail']; ?>"/>
				
   <input type="checkbox" name="cgu" id="cgu" value=1 />
   <label for="cgu">J'accepte les <a href="mentionslegals.html">conditions générales d'utilisation</a> ! </label>
   
   <input type="submit" name="inscription" value="Inscription" />

</form>
Donc non tu ne mettras pas ton post pour chaque value, fais le uniquement quand tu en as besoin (un peu de bon sens ^^)

Eléphant du PHP | 290 Messages

18 août 2014, 17:23

Merci pour la réponse spécifique aux cases à options, aux cases à cocher et aux listes déroulantes.
Ca m'aide mais j'ai encore un peu de difficultés. Je garde la question 4) par rapport au point ci-dessus.

1) J'ai une question quant à mon formulaire.
Mon formulaire se trouve sur une session à accès réservé à laquel on accède
avec un nom d'utilisateur et un mot de passe.
La page d'accès à la session demande qu'on entre d'abord son nom d'utilisateur
et son mot de passe.
Sur mon SGBD, il y a une table (je l'appelle A) avec trois colonnes: une première colonne
qui indique le numéro de client qui s'inscrit automatiquement par auto_incrémentation,
une seconde colonne qui correspond au nom d'utilisateur demandé pour entrer
dans la session et une troisième colonne qui correspond au mot de passe demandé aussi
pour entrer dans la session.
Une fois que l'utilisateur entre dans la session, il va pouvoir avoir accès à un formulaire de réservation.
A ce formulaire de réservation correspond sur mon SGBD une table (que j'appelle B).
La difficulté est que je veux que la première ligne de cette table corresponde au numéro de client.
Pouvez-vous me dire si ma démarche est bonne, je ne suis pas sûr:
- J'ajoute un champs caché tout en haut de mon formulaire de réservation avec comme valeur le numéro
de client qui se trouve sur la table du formulaire des identifiants (la table A).
Pour avoir ce numéro de client, au-dessus du champs caché j'écris du php me permettant d'aller chercher
ce numéro de client sur mon SGBD dans la table A.
Ce qui donne:
$connexion=mysqli_connect($hote,$utilisateur,$motPasse) or die ("Connexion au serveur impossible.");
$nombase=mysqli_select_db($connexion,$nombase) or die ("Sélection de la base impossible.");
 
$req="SELECT le_numero_de_client FROM la_table_A WHERE
$nom_utilisateur = $_SESSION['nom_utilisateur'] && $mot_de_passe = $_SESSION['mot_de_passe']";
 
$query=mysqli_query($connexion,$req) or die ("Exécution de la requête impossible.");

$chart = mysqli_fetch_assoc($query);
extract($chart);
A la suite de quoi je mets en premier champs de formulaire:
<input type="hidden" name="numero_client" value="<?php echo $numero_client; ?>"
Suite à quoi se trouvent les autres champs du formulaire.
Qu'en pensez-vous?

2) J'ai toujours un soucis quant à la date du jour.
Lorsqu'en tant qu'utilisateur je choisis une date de réservation,
je suis automatiquement renvoyé sur ma page de traitement de formulaire.
Il faudrait que l'utilisateur choisisse la date en tout dernier :(
J'ai l'impression que ça vient du bouton submit dans:
$afficheJour = "<input type=\"submit\" name=\"datedujourdaujourdhui\" value=\"" . $var . "\"</input>";
Alors que j'ai déjà un bouton submit pour le formulaire en entier
Est-ce que je remplace simplement
type=\"submit\"
par
type=\"text\"
?
Je récupère ainsi suite à validation: $_POST['datedujourdaujourdhui']

3) J'ai un champs pour une seule case à cocher.
Ca pose problème si l'utilisateur ne coche pas la case.
Hors, je souhaite que l'utilisateur puisse cocher la case ou non.
Mon code est très simple:
<input type="checkbox" name="option_supplementaire" value="option_selectionnee"/>
J'ai pourtant fait attention à ce que ce champs de formulaire ne soit pas vu comme un
champs obligatoire dans ma page de traitement de formulaire.

4) D'après ton code, si je comprends bien tu me donnes deux astuces:
-tu utilises un placeholder pour libérer un value
-dans le php à l'intérieur de value, tu regarde d'abord avec un isset si la variable existe et
si oui tu en donne la valeur postée.
Tu fais alors ça pour tous les champs value et comme il peut exister qu'une seule réponse, c'est celle-ci
qui apparaîtra à l'écran comme valeur postée.
Tu fais pareil pour les cases d'options et les listes déroulantes.
C'est bien ça?