par
sadeq » 02 juin 2005, 16:49
Attention, il ne faut jamais remettre en cause une solution en bidouillant et ajoutant des trucs qu'on ne peut plus maitriser.
Introduire une nouvelle façon pour résoudre le problème affecte négativement ton code. D'autant plus que tu ne sais même pas pourquoi ça ne fonctionne pas comme tu veux.
En fait, ton code est correct même sans les fermétures des th et des td.
Ce qui ne va pas c'est la condition IF qui te permet de savoir si tu dois placer une céllule ou pas.
On lit dans ton code au niveau de :
//Attention: ne pas créer de cellule si le créneau précédent l'a déjà consommée à cause d'une durée qui dépasse 1 heure
//$c : le n° du créneau et $j celui du jour du RDV
if (!($c>0 && $durées_RDV[$c-1][$j]>1)) {
//la céllule qui s'affiche peut consommer plusieurs lignes selon la durée du RDV planifié (c'est ROWSPAN qui s'en charge)
//BGCOLOR permet de peindre le fond si le RDV existe
//COLOR change de couleur de texte si le RDV existe
?>
<td valign="middle" align="center" width="18%" rowspan=<? echo $durées_RDV[$c][$j]; ?>
bgcolor="<? echo $durées_RDV[$c][$j]>0?"silver":""; ?>" style="color:<? echo $RDV[$c][$j]=="Rien"?"":"red"; ?>">
<?
echo $RDV[$c][$j];
}//fin if
que tu ne place ce <td> que si la durée du créneau $c-1 précédent le créneau $c en cours ne dépasse 1.
Hé bien ce n'est pas suffisant, le créneau $c-1 n'est pas obligé d'avoir une durée >1 et qu'il soit le responsable d'un rowspan (qui peut être provoqué par un $c-2 ou inférieur)
En d'autres termes, pour placer un créneau $c ou pas, il faut vérifier tous les créneaux allant de $c à 0 pour voir si un de ces crénneau inférieurs $ $c a déja placé un rowspan parceque sa durée est >1.
Je te propose une correction de cette condition. En fait, c'est une petite fonction qui parcours la plage de $c à 0 à la recherche d'un créneau précédent à $c qui aurait placé un rowspan et qui répond : occupé ou pas.
Et là ça marche sur des roulettes même si t'as plusieurs RDV dans la même journée.
ton programme corrigé :
<table width="100%" border="6" cellpadding="5" cellspacing="2" table background="images/fond2.gif">
<tr><th width="11%">
<?
//Fonction qui cherche si un créneau $c est placé dans une plage occupée par des créneaux et ce pour le même jour $j
function occupé($c,$j){
//Pour accèder au tableau
global $durées_RDV;
//Cherche le premier créneau occupé ce jour $j où $c est inclu : dans ce cas retourne vrai
for ($x=0; $x < $c; $x++) if ($durées_RDV[$x][$j]>1 && $c < $x + $durées_RDV[$x][$j]) return true;
//si aucun créneau occupé trouvé retourne faux
return false;
}
//La base de données
$jour=Array(0=>"Lundi", 1=>"Mardi", 2=>"Mercredi", 3=>"Jeudi", 4=>"Vendredi");
//initialiser les RDV et leurs durées (à rien et 0 heure par défaut)
for ($c=0; $c < 10; $c++) for ($j=0; $j <5; $j++) $RDV [$c][$j] = "Rien";
for ($c=0; $c < 10; $c++) for ($j=0; $j <5; $j++) $durées_RDV [$c][$j] = 0;
// exemples de RDV en dur
// RDV le lundi de 8h à 16h
$RDV [0][0] = "RDV1";
$durées_RDV [0][0] = 8;
// RDV le mardi de 8h à 10h
$RDV [0][1] = "RDV2";
$durées_RDV [0][1] = 2;
// RDV le mardi de 13h à 18h
$RDV [5][1] = "RDV3";
$durées_RDV [5][1] = 5;
// RDV le mercredi de 9h à 14h
$RDV [1][2] = "RDV4";
$durées_RDV [1][2] = 5;
// RDV le vendreddi de 11h à 13h
$RDV [3][4] = "RDV5";
$durées_RDV [3][4] = 2;
// RDV le vendreddi de 15h à 17h
$RDV [7][4] = "RDV6";
$durées_RDV [7][4] = 2;
//On affiche l'entête du tableau (Les jours)
for ($j=0; $j<5; $j++) {
?>
<th>
<?
echo "$jour[$j]";
}
//En suite on affiche les 8 lignes correspondants aux crénneaux allant de 8H à 18H
//Les 8 crénneau peuvent être calculés automatiquement à partir de 8H
$hd = 8; //Heure de départ des crénneaux d'un jour
for ($c=0; $c < 10 ; $c++){
//La première colonne de la ligne contient le crénneau calculé à partir de $hd
?>
<tr>
<th>
<?
//La durée affichée d'un crénneau est toujour 1 heure
$hf = $hd +1; //par exemple $hf contient 9H si $hd contient 8H
echo "$hd"."H"." à "."$hf"."H";
//Préparer le crénneau suivant
$hd += 1;
//Correction pour le passage de midi à l'après-midi
//if ($hf == 12) $hd = 14;
//La deuxieme partie de la ligne affichée contient les RDV des 5 jours
for ($j=0; $j < 5 ; $j++){
//Attention: ne pas créer de céllule si le crénneau précédent l'a déjà consommée à cause d'une durée qui dépasse 1 heure
//$c : le n° du crénneau et $j celui du jour du RDV
if (!occupé($c,$j) ) { //voir la fonction occupé() qui determine si une céllule peut être créée
//la céllule qui s'affiche peut consommer plusieurs lignes selon la durée du RDV planifié (c'est ROWSPAN qui s'en charge)
//BGCOLOR permet de peindre le fond si le RDV existe
//COLOR change de couleur de texte si le RDV existe
?>
<td valign="middle" align="center" width="18%" rowspan=<? echo $durées_RDV[$c][$j]>0?$durées_RDV[$c][$j]:""; ?>
bgcolor="<? echo $durées_RDV[$c][$j]>0?"silver":""; ?>" style="color:<? echo $RDV[$c][$j]=="Rien"?"":"red"; ?>">
<?
echo $RDV[$c][$j];
}//fin if
}//fin for $j
}//fin for $c
?>
</table>
Attention, il ne faut jamais remettre en cause une solution en bidouillant et ajoutant des trucs qu'on ne peut plus maitriser.
Introduire une nouvelle façon pour résoudre le problème affecte négativement ton code. D'autant plus que tu ne sais même pas pourquoi ça ne fonctionne pas comme tu veux.
En fait, ton code est correct même sans les fermétures des th et des td.
Ce qui ne va pas c'est la condition IF qui te permet de savoir si tu dois placer une céllule ou pas.
On lit dans ton code au niveau de :
[php]//Attention: ne pas créer de cellule si le créneau précédent l'a déjà consommée à cause d'une durée qui dépasse 1 heure
//$c : le n° du créneau et $j celui du jour du RDV
if (!($c>0 && $durées_RDV[$c-1][$j]>1)) {
//la céllule qui s'affiche peut consommer plusieurs lignes selon la durée du RDV planifié (c'est ROWSPAN qui s'en charge)
//BGCOLOR permet de peindre le fond si le RDV existe
//COLOR change de couleur de texte si le RDV existe
?>
<td valign="middle" align="center" width="18%" rowspan=<? echo $durées_RDV[$c][$j]; ?>
bgcolor="<? echo $durées_RDV[$c][$j]>0?"silver":""; ?>" style="color:<? echo $RDV[$c][$j]=="Rien"?"":"red"; ?>">
<?
echo $RDV[$c][$j];
}//fin if [/php]
que tu ne place ce <td> que si la durée du créneau $c-1 précédent le créneau $c en cours ne dépasse 1.
Hé bien ce n'est pas suffisant, le créneau $c-1 n'est pas obligé d'avoir une durée >1 et qu'il soit le responsable d'un rowspan (qui peut être provoqué par un $c-2 ou inférieur)
En d'autres termes, pour placer un créneau $c ou pas, il faut vérifier tous les créneaux allant de $c à 0 pour voir si un de ces crénneau inférieurs $ $c a déja placé un rowspan parceque sa durée est >1.
Je te propose une correction de cette condition. En fait, c'est une petite fonction qui parcours la plage de $c à 0 à la recherche d'un créneau précédent à $c qui aurait placé un rowspan et qui répond : occupé ou pas.
Et là ça marche sur des roulettes même si t'as plusieurs RDV dans la même journée.
ton programme corrigé :
[php]
<table width="100%" border="6" cellpadding="5" cellspacing="2" table background="images/fond2.gif">
<tr><th width="11%">
<?
//Fonction qui cherche si un créneau $c est placé dans une plage occupée par des créneaux et ce pour le même jour $j
function occupé($c,$j){
//Pour accèder au tableau
global $durées_RDV;
//Cherche le premier créneau occupé ce jour $j où $c est inclu : dans ce cas retourne vrai
for ($x=0; $x < $c; $x++) if ($durées_RDV[$x][$j]>1 && $c < $x + $durées_RDV[$x][$j]) return true;
//si aucun créneau occupé trouvé retourne faux
return false;
}
//La base de données
$jour=Array(0=>"Lundi", 1=>"Mardi", 2=>"Mercredi", 3=>"Jeudi", 4=>"Vendredi");
//initialiser les RDV et leurs durées (à rien et 0 heure par défaut)
for ($c=0; $c < 10; $c++) for ($j=0; $j <5; $j++) $RDV [$c][$j] = "Rien";
for ($c=0; $c < 10; $c++) for ($j=0; $j <5; $j++) $durées_RDV [$c][$j] = 0;
// exemples de RDV en dur
// RDV le lundi de 8h à 16h
$RDV [0][0] = "RDV1";
$durées_RDV [0][0] = 8;
// RDV le mardi de 8h à 10h
$RDV [0][1] = "RDV2";
$durées_RDV [0][1] = 2;
// RDV le mardi de 13h à 18h
$RDV [5][1] = "RDV3";
$durées_RDV [5][1] = 5;
// RDV le mercredi de 9h à 14h
$RDV [1][2] = "RDV4";
$durées_RDV [1][2] = 5;
// RDV le vendreddi de 11h à 13h
$RDV [3][4] = "RDV5";
$durées_RDV [3][4] = 2;
// RDV le vendreddi de 15h à 17h
$RDV [7][4] = "RDV6";
$durées_RDV [7][4] = 2;
//On affiche l'entête du tableau (Les jours)
for ($j=0; $j<5; $j++) {
?>
<th>
<?
echo "$jour[$j]";
}
//En suite on affiche les 8 lignes correspondants aux crénneaux allant de 8H à 18H
//Les 8 crénneau peuvent être calculés automatiquement à partir de 8H
$hd = 8; //Heure de départ des crénneaux d'un jour
for ($c=0; $c < 10 ; $c++){
//La première colonne de la ligne contient le crénneau calculé à partir de $hd
?>
<tr>
<th>
<?
//La durée affichée d'un crénneau est toujour 1 heure
$hf = $hd +1; //par exemple $hf contient 9H si $hd contient 8H
echo "$hd"."H"." à "."$hf"."H";
//Préparer le crénneau suivant
$hd += 1;
//Correction pour le passage de midi à l'après-midi
//if ($hf == 12) $hd = 14;
//La deuxieme partie de la ligne affichée contient les RDV des 5 jours
for ($j=0; $j < 5 ; $j++){
//Attention: ne pas créer de céllule si le crénneau précédent l'a déjà consommée à cause d'une durée qui dépasse 1 heure
//$c : le n° du crénneau et $j celui du jour du RDV
if (!occupé($c,$j) ) { //voir la fonction occupé() qui determine si une céllule peut être créée
//la céllule qui s'affiche peut consommer plusieurs lignes selon la durée du RDV planifié (c'est ROWSPAN qui s'en charge)
//BGCOLOR permet de peindre le fond si le RDV existe
//COLOR change de couleur de texte si le RDV existe
?>
<td valign="middle" align="center" width="18%" rowspan=<? echo $durées_RDV[$c][$j]>0?$durées_RDV[$c][$j]:""; ?>
bgcolor="<? echo $durées_RDV[$c][$j]>0?"silver":""; ?>" style="color:<? echo $RDV[$c][$j]=="Rien"?"":"red"; ?>">
<?
echo $RDV[$c][$j];
}//fin if
}//fin for $j
}//fin for $c
?>
</table>
[/php]