HELP for génération planning

Mammouth du PHP | 19672 Messages

02 juin 2005, 16:29

Bon, là je trouve pas immédiatement, l'idée est là, mais ça fonctionne pas, je vais faire des tests.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Poissal
Invité n'ayant pas de compte PHPfrance

02 juin 2005, 16:41

Ok c'est cool, de mon coté j'essaye de aussi de faire des test +

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

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> 
Modifié en dernier par sadeq le 02 juin 2005, 17:06, modifié 1 fois.
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

Poissal
Invité n'ayant pas de compte PHPfrance

02 juin 2005, 16:59

Ok, merci beaucoup sadeq pour ton aide précieuse.
Je vais vérifier si ca marche
:D

Mammouth du PHP | 19672 Messages

02 juin 2005, 19:18

Bon, ben de mon coté, j'y ai mis le temps, mais j'arrive à une solution qui fonctionne. J'ai en fait complètement repris la génération des lignes et des cellules: Il te restera à adapter pour le contenu, je n'ai pas modifié tes variables d'origine, mais j'ai utilisé un système de pointeur en tableau pour m'y retrouver. Méchant casse tête, mais le résultat est là:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" xml:lang="fr">
<title>Agenda</title>
<style type="text/css">
td {text-align: center}
</style>
</head>
<body>
<?
//La base de données
$jour=Array("Lundi", "Mardi", "Mercredi", "Jeudi", "Vendredi");
//initialiser les RDV et leurs durées (à rien et 0 heure par défaut)
// $c représente la cellule pr l'heure de debut et $j le jour du RDV
/*
for ($c=0; $c <10; $c++)
{
for ($j=0; $j<=4; $j++)
{
$RDV[$c][$j] = "&nbsp;";
}
}
for ($c=0; $c <10; $c++)
{
for ($j=0; $j<=4; $j++)
{
$durees_RDV [$c][$j] = 0;
}
}
*/
// exemples de RDV en dur
// RDV1 le lundi de 8h à 11h
$RDV [0][0] = "RDV1";
$durees_RDV [0][0] = 3;
// RDV2 le mardi de 13h à 18h
$RDV [1][5] = "RDV2";
$durees_RDV [1][5] = 5;
// RDV3 le mercredi de 9h à 12h
$RDV [2][1] = "RDV3";
$durees_RDV [2][1] = 4;
// RDV4 le vendreddi de 12h à 14h
$RDV [4][4] = "RDV4";
$durees_RDV [4][4] = 2;
?>
<!-- On construit et génère le tableau -->
<table width="100%" border="6" cellpadding="5" cellspacing="2" summary="">
  <tr>
    <th width="11%">&nbsp;</th>
<?php
//On affiche l'entête du tableau (Les jours)
for ($j=0; $j<=4; $j++)
{
    ?>
    <th width="18%"><? echo $jour[$j]; ?> </th>
    <?
}
?>
  </tr>
<?
/* Construction du pointeur */
$repere = array();
for($a = 0; $a < 10; $a++)
{
    $repere[$a] = array();
    for($o = 0; $o < 5; $o++)
    {
        $repere[$a][$o] = 0;
    }
}

/* construction des lignes de 8h00 à 18h00 */
for($l = 0; $l < 10; $l++)
{
    ?>
  <tr>
    <th>De <?php echo($l+8) ?>h00 à <?php echo($l + 9) ?>h00</th>
    <?php
    /* Construction des cellules */
    for($j = 0; $j < 5; $j++)
    {
        if($repere[$l][$j] == 0)
        {
            /* Construction des cellules avec si nécessaire rowspan si rdv sur plus d'une heure */
            $rendez_vous = isset($RDV[$j][$l])?$RDV[$j][$l]:"&nbsp;";
            $duree = ($rendez_vous != "&nbsp;")?" rowspan =\"".$durees_RDV[$j][$l] ."\" style=\"color: #ff0000; background-color: #cccccc\"":null;
	    	?>
    <td <?php echo($duree); ?>><?php echo($rendez_vous); ?></td>
	    	<?php
	    	$dr = isset($durees_RDV[$j][$l])?$durees_RDV[$j][$l]:null;
	    	if($dr != null && $dr > 1)
	    	{
	    	    $dr--;
	    	    $t1 = $l + 1;
	    	    for($c = 0; $c < $dr; $c++)
	    	    {
	    	        $repere[$t1][$j]++;
	    	        $t1++;
	    	    }
	    	}
        }
    }
    ?>
  </tr>
    <?php
}
?>
</table>
</body>
</html>
Si tu as des problèmes avec celui-ci, préviens moi et dis-moi ce qui cloche.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe: