[RESOLU] Affichage emploi du temps

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] Affichage emploi du temps

Re: [RESOLU] Affichage emploi du temps

par Saian » 27 mars 2021, 21:22

Pour le rowspan et la contrainte de ne pas poser le <td> au dessous, je suis pas très sur de mémoire non plus. Peut être c'est géré directement par html... ceci dit vous avez tout de même une marge d'amélioration pour trouver les cours. Vous pourriez commencer par les indexer sur votre chaine de test ($row['heure_debut']." ".$row['date']). Ça éviterait de boucler sur tous les cours à chaque case.
$query = ("SELECT * FROM addtable ");
$res = $bdd->query($query);
$rows = $res->fetchAll();

// INDEXE LES COURS SUR HEURE DATE
$cours = [];
foreach ($rows as $row) {
  $index = $row['heure_debut']." ".$row['date'];
  $cours[$index] = $row;
}

$jours = array(null, "Lundi", "Mardi", "Mercredi", "Jeudi", "Vendredi");
echo "<div class='container'><table width='' class='table table-bordered' style='text-align:center;' border='1' >
<tr><th></th>";
for ($x = 1; $x < 6; $x++) {
  echo "<th>".$jours[$x]."</th>";
}
echo "</tr>";
for ($heure = 8; $heure <= 18; $heure++) {
  echo "<tr>";
  $heure_aff = $heure;
  if (strlen($heure_aff) <= 2) {
    echo "<td style=\"width:3%; vertical-align:top; text-align:right; background:#CCCCCC; font-weight: bold; \">";
    echo $heure_aff;
    echo "h00";
    echo "</td>";
  }
  for ($d = 0; $d < 5; $d++) {
    $date_num = date("d-m-Y", mktime(0, 0, 0, 1, 20 + $d, 2021));
    $date_lecon = $heure.":00 ".$date_num;
    // SI UN COURS EXISTE
    if (isset($cours[$date_lecon])) {
      echo "<td style=\"padding:10px 5px 10px 5px; border:1px solid #999999;\">";
      $row = $cours[$date_lecon];
      $rdv = $row['cours']."<br>".$row['matiere']."<br>".$row['salle'];
      echo $rdv;
      echo "</td>";
    } 
    // SINON
    else {
      "<td style=\"padding:10px 5px 10px 5px; border:1px solid #999999;\"></td>";
    }
  }
  echo "</tr>";
}
echo "</table>";

Re: Affichage emploi du temps

par duckmysick » 27 mars 2021, 21:07

Merci énormément de votre aide c'est fonctionnel grâce vous vraiment merci !!

Re: Affichage emploi du temps

par Saian » 27 mars 2021, 20:46

Je vous renvois à mon premier message ou vous aviez déjà toutes les réponses. Prenez juste le temps de bien le lire et essayez de bien comprendre.

PS : en fait ça s'est perdu dans un edit, mais je vous expliquais à un moment, si le cours s'étale sur plusieurs heures, utilisez l'attribut rowspan du <td> pour que la case s'allonge sur plusieurs lignes (par exemple rowspan="2" pour deux lignes). Attention toutefois dans ce cas de ne pas mettre le <td> sur la ligne du dessous sinon vous allez avoir un décalage. Ça risque d'être un peu casse tête à gérer et vous allez surement devoir vous y prendre à plusieurs fois pour obtenir le résultat escompté. Notamment le <td> étant posé avant de boucler sur les cours, vous allez avoir du mal à ajouter le rowspan. Il faut donc que vous repensiez un peu la structure du code. Par exemple boucler d'abord sur les cours voir si vous en trouvez un et selon que vous l'ayez trouvé ou non, poser tel ou tel <td>.

Pour le rowspan et la contrainte de ne pas poser le ou les <td> du dessous, par exemple si un cours est trouvé pour une case et qu'il dure 2 heures, en plus de mettre le rowspan="2" sur le <td>, vous pourriez alors définir une variable $hasRowspan['col' . $colNum] = $heureFin;
Sur la boucle de création des <td> avant de poser le <td> vous vérifiez if (isset($hasRowspan['col' . $colNum]) && $hasRowspan['col' . $colNum] >= $heureActuelle) continue; pour sauter la case. C'est une idée, il y a surement un tas de façons de procéder et étant donné que je ne l'ai pas testé il faudra probablement l'adapter, le corriger pour que ça fonctionne bien comme désiré.

Re: Affichage emploi du temps

par duckmysick » 27 mars 2021, 20:43

Je vois c'était juste ça, j'avais mal le fait le fetchAll et le foreach plus tôt..... Cela dit pourriez vous me guider ecnore une fois, le créneau du jeudi est un créneau de 2h or, il ne s'affiche que de 10 à 11h au lieu de 10h à 12h ?

Re: Affichage emploi du temps

par Saian » 27 mars 2021, 20:32

Et qu'en concluez-vous ? moi j'en conclurais que le jeu de résultats n'est parcourus qu'une seule fois. Et donc je testerais avec le fetchAll et le foreach...
$query = ("SELECT * FROM addtable ");
$res = $bdd->query($query);
$rows = $res->fetchAll();// ICI !!!
$jours = array(null, "Lundi", "Mardi", "Mercredi", "Jeudi", "Vendredi");
echo "<div class='container'><table width='' class='table table-bordered' style='text-align:center;' border='1' >
<tr><th></th>";
for ($x = 1; $x < 6; $x++) {
  echo "<th>".$jours[$x]."</th>";
}
echo "</tr>";
for ($heure = 8; $heure <= 18; $heure++) {
  echo "<tr>";
  $heure_aff = $heure;
  if (strlen($heure_aff) <= 2) {
    echo "<td style=\"width:3%; vertical-align:top; text-align:right; background:#CCCCCC; font-weight: bold; \">";
    echo $heure_aff;
    echo "h00";
    echo "</td>";
  }
  for ($d = 0; $d < 5; $d++) {
    $date_num = date("d-m-Y", mktime(0, 0, 0, 1, 20 + $d, 2021));
    echo "<td style=\"padding:10px 5px 10px 5px; border:1px solid #999999;\">";
    $date_lecon = $heure.":00 ".$date_num;
    foreach ($rows as $row) {// ET ICI !!!
      if ($date_lecon == $row['heure_debut']." ".$row['date']) {
        $rdv = $row['cours']."<br>".$row['matiere']."<br>".$row['salle'];
        echo $rdv;
      }
    }
    echo "</td>";
  }
  echo "</tr>";
}
echo "</table>";

Re: Affichage emploi du temps

par duckmysick » 27 mars 2021, 20:05

Voilà ce que j'obtiens en faisant ce que vous conseillez:
8:00 20-01-2021 ==? 8:00 20-01-2021
10:00 23-01-2021 ==? 8:00 20-01-2021
13:00 09-09-2021 ==? 8:00 20-01-2021
14:00 18-09-2021 ==? 8:00 20-01-2021
15:00 20-09-2021 ==? 8:00 20-01-2021
8:00 01-09-2021 ==? 8:00 20-01-2021

tout ça uniquement dans la première case et peu importe le nombre de while

Re: Affichage emploi du temps

par Saian » 27 mars 2021, 19:50

Bah j'ai pas vérifié le comportement du fetch donc j'affirme rien mais c'est pas compliqué à tester, il suffit de mettre par exemple deux fois la boucle while et voir si le résultat s'affiche deux fois ou une fois.

Si le fetch ne remet pas le curseur à 0 lors du retour false, alors le problème vient bien de la et dans ce cas il suffit après le $res = $bdd->query($query); de faire par exemple un $rows = $res->fecthAll(); et à la place du while faire un foreach ($rows as $row). Tu peux t'assurer que les boucles se font bien avec un simple echo non conditionné par un if et tu peux également vérifier tes conditions simplement en affichant les valeurs testées.

Déjà rien que ça tu y verras plus clair :
while ($row = $res->fetch()) {
    echo $row['heure_debut'] . " " . $row['date'] . ' ==? ' . $date_lecon . '<br/>';
}

Re: Affichage emploi du temps

par duckmysick » 27 mars 2021, 19:42

Ouais j'ai bien compris que le while avait un problème mais même en essayant avec un foreach + fetchAll j'ai le même résultat ou alors je n'ai pas compris comment faire et dans ce cas-là pouvez-vous me montrer ?

Re: Affichage emploi du temps

par Saian » 27 mars 2021, 19:34

Je te le remets la. Et je te repose la question, t'es tu assuré que le while s'exécute bien dans chaque case du tableau ? Si il ne s'exécute que dans la première case mais que pour les autres il ne s'exécute pas (en gros il fait false dès le premier fetch), tu as probablement un élément de réponse dans cette citation.
Tu pourrais vérifier aussi si le while se fait bien dans toutes les cases ? parce que tu utilises pdostatement::fetch pour boucler sur les résultats et donc quand il arrive à la fin du jeu de résultats il retourne false ce qui provoque la sortie du while mais remet-il le curseur à 0 ? Si c'est pas le cas, tu pourrais faire un fetchAll pour récupérer les résultats dans un tableau sur lequel tu pourras boucler autant de fois que tu veux avec un foreach.

Re: Affichage emploi du temps

par duckmysick » 27 mars 2021, 19:21

Non justement il ne s'effectue que dans une cellule. Les valeurs que je teste avec le if sont identiques, elles sortent de la même manière... J'ai testé ça:

Code : Tout sélectionner

foreach($res->fetchAll() as $rows => $row){ if($date_lecon == $row['heure_debut']." ".$row['date']){ $rdv = $row['cours']."<br>".$row['matiere']."<br>".$row['salle']; echo $rdv; } } echo "</td>";
j'obtiens uniquement l'id 47 de ma table dans la première cellule.

On rentre dans le while 6 fois (mais uniquement la première cellule) et dans le if une seule fois.

Re: Affichage emploi du temps

par Saian » 27 mars 2021, 18:51

Je pense t'avoir donné une bonne piste pour le while. Qu'as tu testé ? t'es tu assuré que le while s'exécute bien pour chaque case ?

Re: Affichage emploi du temps

par duckmysick » 27 mars 2021, 17:36

personne ? :(

Re: Affichage emploi du temps

par duckmysick » 26 mars 2021, 22:50

Le $row['heure_debut']." ".$row['date'] est correct il m'affiche l'heure et toutes les dates de ma table par contre le $date_lecon reste identique....

mais si je supprime le while et tout ce qui va avec et echo le $date_lecon dans le for j'obtiens ça pourtant:
Image

Re: Affichage emploi du temps

par Saian » 26 mars 2021, 22:13

Salut, $row['date'] serait pas plutôt de la forme Y-m-d ?

En tout cas tu devrais vérifier les valeurs de cette condition :
if($date_lecon == $row['heure_debut']." ".$row['date']){
puisqu'à priori elle ne fonctionne que pour lundi 8h et pour un seul cours.

Tu pourrais vérifier aussi si le while se fait bien dans toutes les cases ? parce que tu utilises pdostatement::fetch pour boucler sur les résultats et donc quand il arrive à la fin du jeu de résultats il retourne false ce qui provoque la sortie du while mais remet-il le curseur à 0 ? Si c'est pas le cas, tu pourrais faire un fetchAll pour récupérer les résultats dans un tableau sur lequel tu pourras boucler autant de fois que tu veux avec un foreach.

Une alternative serait de poser les cours sur le tableau en javascript mais cela en demande une certaine maîtrise même si c'est pas si compliqué quand on a l'habitude.

Affichage emploi du temps

par duckmysick » 26 mars 2021, 20:25

Bonjour à tous j'ai vraiment besoin d'aide je galère pas mal et m'excuse si je suis dans la mauvaise section.
Alors en gros je voudrais afficher un emploi du temps comme celui-ci :
Image sans l'heure affiché sur les cours mais je voudrais afficher la date du jour avec le jour.

Pour le moment voici ce que j'ai rédigé

Code : Tout sélectionner

$bdd->exec("CREATE TABLE addtable ( id INTEGER PRIMARY KEY AUTOINCREMENT, dpt varchar(250) NOT NULL, cours varchar(250) NOT NULL, matiere varchar(250) NOT NULL, salle varchar(250) NOT NULL, heure_debut varchar(250) NOT NULL, heure_fin varchar(250) NOT NULL, date DATE);"); $bdd->exec("INSERT INTO addtable (id, dpt, cours, matiere, salle, heure_debut, heure_fin, date) VALUES (47, 'Informatique', 'TP', 'Programmation web 1', 'G310', '8:00', '9:00', '20-01-2021'),(48, 'Mathématiques', 'TD', 'Mathématiques 1', 'P14', '10:00', '12:00 ', '23-01-2021'),(50, 'Sciences de la vie et de la Terre', 'CM', 'Sciences de la vie et de la terre 1', 'S25', '13:00', '14:00', '09-09-2021'),(51, 'Physique-Chimie', 'TP', 'Programmation web 1', 'G110', '14:00', '15:00', '18-09-2021'), (52, 'Informatique', 'TD', 'Algorithme et programmation 1', 'D101', '15:00', '17:00', '20-09-2021'), (53, 'Mathématiques', 'CM', 'Mathématiques 2', 'S19','8:00', '10:30', '01-09-2021');");

Code : Tout sélectionner

$query = ("SELECT * FROM addtable "); $res = $bdd->query($query); $jours = array(null, "Lundi", "Mardi", "Mercredi", "Jeudi", "Vendredi"); echo "<div class='container'><table width='' class='table table-bordered' style='text-align:center;' border='1' > <tr><th></th>"; for($x = 1; $x < 6; $x++){ echo "<th>".$jours[$x]."</th>"; } echo "</tr>"; for ($heure = 8; $heure <= 18; $heure++) { echo "<tr>"; $heure_aff = $heure; if(strlen($heure_aff) <= 2) { echo "<td style=\"width:3%; vertical-align:top; text-align:right; background:#CCCCCC; font-weight: bold; \">"; echo $heure_aff; echo "h00"; echo "</td>"; } for($d = 0; $d < 5; $d++){ $date_num = date("d-m-Y", mktime(0, 0, 0, 1, 20+$d, 2021)); echo "<td style=\"padding:10px 5px 10px 5px; border:1px solid #999999;\">"; $date_lecon = $heure.":00 ".$date_num; while($row = $res->fetch()){ if($date_lecon == $row['heure_debut']." ".$row['date']){ $rdv = $row['cours']."<br>".$row['matiere']."<br>".$row['salle']; echo $rdv; } } echo "</td>"; } echo "</tr>"; } echo "</table>";
la sortie acutelle:

Image

Mais tout s'affiche dans la première cellule, peu importe le code ça ne prend pas en compte le if ou je compare la date de la case avec celui de ma table alors que pourtant si je echo $date_lecon juste avant le while toutes les cases sont bien rempli avec par exemple: "8:00 2401-2021" juste en dessous "9:00 24-01-2021" (sans guillemets) et ainsi de suite jusqu'au vendredi derniere cellule guillements.

Merci d'avance et par pitié aidez-moi !