Page 1 sur 1

pb affichage des absences ds planning

Posté : 04 juin 2005, 18:51
par Invité
Hello everybody,
j'ai recupéré un planning sympa sur ce forum mais moi j'affiche mes rendez-vous a partir d'une reqête qui va les chercher ds ma base.
Et maintenant, je souhaite ajouter les absences.
J'ai ecrit ma requete mais j'arrive pas afficher !
Quelqu'un pourrait-il m'aider pour le faire?
Il faudrait afficher les absences en meme temps que les rendez-vous ds le planning d'une autre couleur
Merci..

Voila mon code :

<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] = "*"; 
for ($c=0; $c < 10; $c++) for ($j=0; $j <5; $j++) $durées_RDV [$c][$j] = 0;


//On affiche l'entête du tableau (Les jours) 
for ($j=0; $j<5; $j++) { 
?> 
<th width="18%" class="colonnetableau"> 
<? 
	// affichage du jour et de la date dans les en-têtes des colonnes
		$aWeek=$vsem; $aYear=$van; 
		for ($aDay=0;$aDay<5;$aDay++) {
		$adate=datefromweeknr($aYear, $aWeek, $aDay+1);
		if ($j==$aDay) {
		echo "$jour[$j]<br>"; 
		$datentete = date('Y-m-d',$adate);
		echo ' '.date('d-m-Y',$adate).'<br>'; ?> </th> <?
		
			require('config/myConnexion.php');
			require('config/connect.php');
	// requête pour la récupération des RDV
	$query2 = 'SELECT libelle_rdv as lib, heure_deb, heure_fin, avoir.date
				FROM rendezvous, avoir
				WHERE avoir.code_rdv=rendezvous.code_rdv 
				AND code_util="'.$vnom.'" 
				AND date="'.$datentete.'"';
	$result2 = mysql_query ($query2) or die (" La requête pour la recherche des rendez-vous a échouée ");
	while ($row_Resul2=mysql_fetch_assoc($result2)) {
	$c = $row_Resul2['heure_deb']-8 ;
	$j = $aDay;
	$RDV [$c][$j] = $row_Resul2['lib']; 
	$durées_RDV [$c][$j] = $row_Resul2['heure_fin']-$row_Resul2['heure_deb']; }
	mysql_close();

			require('config/myConnexion.php');
			require('config/connect.php');
	// requête pour la récupération des ABS
	$query3 = 'SELECT motif as lib, duree, etre.date 
				FROM absence, etre WHERE etre.code_abs=absence.code_abs 
				AND code_util="'.$vnom.'" 
				AND date="'.$datentete.'"';
	$result3 = mysql_query ($query3) or die (" La requête pour la recherche des absences a échouée ");
	while ($row_Resul3=mysql_fetch_assoc($result3)) {
	$RDV [$c][$j] = $row_Resul3['lib'];
	$j = $aDay;
		if ($row_Resul3['duree'] == "Matinée") { $c = 0 ; $durées_RDV [$c][$j] = 5;}
		if ($row_Resul3['duree'] == "Après-midi") { $c = 5 ; $durées_RDV [$c][$j] = 5;}
		if ($row_Resul3['duree'] == "Journée") { $c = 0 ; $durées_RDV [$c][$j] = 10;}
	}
	mysql_close();
}
}
}
?>
</tr>
<?

//Ensuite on affiche les 8 lignes correspondants aux créneaux allant de 8H à 18H 
//Les 8 crénneau peuvent être calculés automatiquement à partir de 8H 
$hd = 8; //Heure de départ des créneaux 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]=="*"?"":"purple"; ?>"> 
<? 
echo $RDV[$c][$j];
}//fin if 
}//fin for $j 
}//fin for $c 
?> 
</table> 

Re: pb affichage des absences ds planning

Posté : 04 juin 2005, 19:01
par BFH
...
j'ai recupéré un planning sympa sur ce forum mais moi j'affiche mes rendez-vous a partir d'une reqête qui va les chercher ds ma base.
J'ai ecrit ma requete mais j'arrive pas afficher !
Quelqu'un pourrait-il m'aider pour le faire?
Il faudrait afficher les absences en meme temps que les rendez-vous ds le planning d'une autre couleur
Est ce que tu as une erreur qui s'affiche ou bien tu as une page blanche ou autre chose?
Plus de détails sur l'erreur retournée nous aiderais à comprendre.

Tu peux nous donner la structure de ta table stp ?

Posté : 04 juin 2005, 19:12
par Invité
Mon tableau s'affiche correctement je n'ai pas d'erreur ou de page blanche.
Le problème vien ds l 'affichage des absences.
J'ai bien la plage qui va se griser (couleur silver) mais je n'ai pas de libellé, ca me met * alors que c'est ca que j'affiche ds les créneaux quand il y a ni rdv ni abs.
Un moment, j'ai le libellé d'une abs qui s'est affiché mais ds la plage d'un rdv. Par exemple j'avé mi un rdv le matin et une abs l'aprem et donc le libellé de l'abs l'aprem s'est affiché ds la plage du rdv du matin.

Donc la j'ai gros souci...
Faudrait-il pa modifier les variables $RDV et $durées_RDV par $ABS et $durées_ABS par exemple ?

Posté : 04 juin 2005, 20:17
par Cyrano
Tiens, j'ai un peu arrangé ce que j'avais fait pour l'autre dont tu parlais pour y intégrer les absences. À toi d'adapter le script à ton gout.

J'ai notament modifié le système en utilisant une seule variable, mais en tableau multidimensionnel pour chaque rendez-vous.

Le seul truc que j'ai pas encore mis en place, c'est une sécurité qui fasse que deux rendez-vous ne puissent pas se chevaucher.

Enfin voilà déjà ça:
<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)
/**
* $RDV est un tableau à trois dimensions: 
* En décomposant par exemple: $RDV[x][y][z]:
* - x représente le jour du RDV : si x vaut 0 c'est lundi, 1 mardi etc... jusqu'à 4 vendredi
* - y représente l'heure du début du rendez-vous: 0 à 8h00 jusqu'à 9 pour 17h00
* - z peut a trois valeurs:
* --- 0 : l'intitulé du rendez-vous
* --- 1 : la durée en heures du rendez-vous en chiffre 
* --- 2 : L'état de présence, 0 = absent, 1 = présent
* (Note: si la durée va au-delà de 18h00, l'excédent ne sera pas reporté au lendemain et la durée s'arrêtera à 18h00)
*/

// exemples de RDV en dur
// RDV le lundi de 8h à 11h
$RDV[0][0] = array("RDV M. Untel",3,1);
// RDV le lundi de 8h à 11h
$RDV[0][4] = array("RDV M. Untel",1,1);
// Absence le mardi de 13h à 18h
$RDV[1][5] = array("Absent congrès", 5, 0);
// RDV3 le mercredi de 9h à 12h
$RDV[2][3] = array("RDV madame Chose", 4, 1);
// Absence le vendreddi de 12h à 14h
$RDV[4][4] = array("Déjeuner Client", 2, 0);
?>
<!-- On construit et génère le tableau -->
<table width="100%" border="6" cellpadding="5" cellspacing="2" summary="">
  <tr>
    <th width="10%">&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][0])?$RDV[$j][$l][0]:"&nbsp;";
            if($rendez_vous != "&nbsp;")
            {
                $coul = $RDV[$j][$l][2] == 1?"#333399":"#cc3333";
                $arrpl = $RDV[$j][$l][2] == 1?"#00ff00":"#9999ff";
                /* Petite sécurité: le rendez-vous ne doit pas se finir au-delà de 18heures, donc on vérifie que la durée est correcte */
                if(($RDV[$j][$l][1] + $l) > 9)
                {
                    $RDV[$j][$l][1] = (10 - $l);
                }
            }

            $duree = ($rendez_vous != "&nbsp;")?" rowspan =\"".$RDV[$j][$l][1] ."\" style=\"color: ". $coul ."; background-color: ". $arrpl ."\"":null;
	    	?>
    <td <?php echo($duree); ?>><?php echo($rendez_vous); ?></td>
	    	<?php
	    	$dr = isset($RDV[$j][$l][1])?$RDV[$j][$l][1]: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>
Essaye-le tel quel, pour le moment, les dates de rdv sont en dur, mais il te reste à initialiser des variables dynamiques à partir de ta base. Tu auras deux couleurs différentes (à configurer ligne 80 et 81 selon tes goûts) pour les rdv et les absences.

Posté : 04 juin 2005, 23:25
par Invité
Merci pr le code mais j'arrive pas a l'adapter. Il faut que j'arrive à faire incrémenté les variables $x $y et $z. Mais pour la derniere variable, je ne sais comment faire car elle est composée de 3 paramètres.
Peut-on m'aider ?
    <? 
			require('config/myConnexion.php');
			require('config/connect.php');
	// requête pour la récupération des RDV
	$query2 = 'SELECT libelle_rdv as lib, heure_deb, heure_fin, avoir.date
				FROM rendezvous, avoir
				WHERE avoir.code_rdv=rendezvous.code_rdv 
				AND code_util="'.$vnom.'" 
				AND date="'.$datentete.'"';
	$result2 = mysql_query ($query2) or die (" La requête pour la recherche des rendez-vous a échouée ");
	while ($row_Resul2=mysql_fetch_assoc($result2)) {
	$x = $aDay;
	$y = $row_Resul2['heure_deb']-8 ;
	$RDV [$x][$y] = $row_Resul2['lib']; 
	$durées_RDV [$x][$y] = $row_Resul2['heure_fin']-$row_Resul2['heure_deb']; }
	mysql_close();

			require('config/myConnexion.php');
			require('config/connect.php');
	// requête pour la récupération des ABS
	$query3 = 'SELECT motif as lib, duree, etre.date 
				FROM absence, etre WHERE etre.code_abs=absence.code_abs 
				AND code_util="'.$vnom.'" 
				AND date="'.$datentete.'"';
	$result3 = mysql_query ($query3) or die (" La requête pour la recherche des absences a échouée ");
	while ($row_Resul3=mysql_fetch_assoc($result3)) {
	$x = $aDay;
	$RDV [$x][$y] = $row_Resul3['lib'];
		if ($row_Resul3['duree'] == "Matinée") { $y = 0 ; $durées_RDV [$x][$y] = 5;}
		if ($row_Resul3['duree'] == "Après-midi") { $y = 5 ; $durées_RDV [$x][$y] = 5;}
		if ($row_Resul3['duree'] == "Journée") { $y = 0 ; $durées_RDV [$x][$y] = 10;}
	}
	mysql_close();
}
}

} 
?>

Posté : 05 juin 2005, 01:30
par Cyrano
Ok,
le script de base tel que présenté ne tient pas compte du calendrier, c'est peut-être bien un problème tout comme on peut le contourner.
On va donc se limiter dans l'immédiat sur la semaine. Nous avons besoin de 5 paramètres. Notons aussi que le terme de rendez-vous est innapproprié et peut aussi représenter une période d'absence.
- Le jour de la semaine pour le rendez-vous;
- L'heure à laquelle débute le rendez-vous (ou l'absence)
- L'intitulé du rendez-vous;
- La durée en heures du rendez-vous;
- La sorte de rendez-vous: présent ou absence

Si je regarde la première requête, nous avons:
- l'intitulé;
- l'heure du début;
- l'heure de fin;
- La date;
À partir de la date, nous pouvons déterminer le jour de la semaine qui déterminera $x;

L'intitulé se retrouve dans $RDV[$x][$y][0] = intitulé;

Avec l'heure de début, nous déterminons $RDV[$x][$y][1] = fin - début

Enfin, s'il s'agit d'un rendez-vous, $RDV[$x][$y][2] = 1, s'il s'agit d'une absence, $RDV[$x][$y][2] = 0

Nous n'avons pas besoin d'incrémenter quoique ce soit partant du principe que deux rendez-vous ne se chevauchent pas lorsqu'ils sont enregistrés.

On peut donc modifier un peu ta construction comme ceci pour les rendez-vous:
/* Sur le schéma de la requête suivante, on considère que avoir.date est au format "yyyy-mm-dd" et l'heure au format hh:mn */
$query2 = 'SELECT libelle_rdv as lib, heure_deb, heure_fin, avoir.date
           FROM rendezvous, avoir
           WHERE avoir.code_rdv = rendezvous.code_rdv
           AND code_util="'.$vnom.'"
           AND date="'.$datentete.'"';
$result2 = mysql_query ($query2) or die (" La requête pour la recherche des rendez-vous a échoué ");
while ($row_Resul2=mysql_fetch_assoc($result2))
{
    /* À partir de la date, on va déterminer le jour de la semaine */
    $annee = substr($row_Resul2['date'],0,4);
    $mois  = substr($row_Resul2, 4, 2);
    $jour  = substr($row_Resul2, 7, 2);
    /* On détermine le jour de la semaine au format numérique */
    $joursemaine = date("w", mktime(0,0,0,$mois, $jour, $annee));
    /* On modifie le jour en mettant le lundi à 0 à la place du dimanche */
    $x = ($joursemaine = 0) ? 6 : ($joursemaine-1);
    /* On établit l'heure du début du rendez-vous */
    $heure_d = substr($row_Resul2['heure_deb'],0,2);
    $y = $heure_d - 8 ;
    /* On établit le libellé du rendez-vous */
    $lib = $row_Resul2['lib'];
    /* On établit la durée du rendez-vous */
    $heure_f = substr($row_Resul2['heure_fin'],0,2);
    $dur = $heure_f - $heure_d;
    /* Ce n'est pas une absence, on met l'état à 1 */
    $etat = 1;
    /* On construit le tableau $RDV */
    $RDV[$x][$y] = array($lib, $dur, $etat);
}
Il te reste à faire la même chose pour les absences en mettant le dernier paramètre à 0 au lieu de 1 puisque ce sont les absences.