Composant HTML calendrier jour
$calendar_day_view = new CalendarDay(); echo $calendar_day_view->html;
Visibilité | Type | Nom | Status | Description |
---|---|---|---|---|
public | string | title | Le titre du composant | |
public | array | timeline | La représentation de chaque heure de la journée. Par défaut, c'est l'affichage style “11 am”, “5 pm”, etc. | |
public | string | html | Lecture seule | L’affichage HTML du componsant |
Visibilité | Nom | Param 1 | Param 2 | Param 3 | Param 4 | Param 5 | Param 6 | Param 7 | Description |
---|---|---|---|---|---|---|---|---|---|
public | addEvent | string $title | int $timeStart | int $timeLength | string $url | string $description | int $titleLength | string $style | Ajoute un événement |
Création
/** * Composant html calendrier jour * @package com.neolao * @subpackage components * @author neolao <neo@neolao.com> * @version 1.0 (06/05/2005) * @link http://resources.neolao.com/php/classes/components/calendarday */ class CalendarDay { // ----------------------------- CONSTANTES -------------------------------- // ----------------------------- VARIABLES --------------------------------- /** * Le style CSS du composant (class) * @var string */ private $_cssClass; /** * Le titre du composant * @var string */ private $_title; /** * Les représentations des heures * @var array */ private $_timeline; /** * Les événements de la journée * @var array */ private $_events; /** * Le calendrier en html * @var string */ private $_html; /*===================== CONSTRUCTEUR & DESCTRUCTEUR ======================*/ /*========================================================================*/ /** * Initialisation de la class * @param string $cssClass Le style CSS du composant (class) */ function __construct($cssClass=null){ if(!is_null($cssClass)){ $this->_cssClass = $cssClass; } // valeurs par défaut $this->_title = ""; $this->_timeline = array("0 am", "1 am", "2 am", "3 am", "4 am", "5 am", "6 am", "7 am", "8 am", "9 am", "10 am", "11 am", "12 am", "1 pm", "2 pm", "3 pm", "4 pm", "5 pm", "6 pm", "7 pm", "8 pm", "9 pm", "10 pm", "11 pm"); } /** * Destruction de la class */ function __destruct(){ } /*=============== FIN = CONSTRUCTEUR & DESCTRUCTEUR = FIN ================*/ /*========================================================================*/ /*=========================== METHODES PRIVEES ===========================*/ /*========================================================================*/ private function setHtml(){ $ok = false; // Vérification de la validité des variables qui vont être utilisées if(count($this->_timeline) == 24){ // La timeline fait bien 24 $ok = true; } if($ok){ // Génération des variables utiles // Tous les événements sont dans $this->_events // Il faut pouvoir créer des colonnes si les événements ne se succèdent pas $eventsTotal = count($this->_events); // Cette variable va être décrémentée pour vérifier si on a bien affiché tous les événements $rows = array(); // Cette variable va contenir chaque ligne du tableau // On commence par mettre la timeline (première colonne) for($i=0; $i<24; $i++){ $rows[$i] = array("<td class=\"timeline\">".$this->_timeline[$i]."</td>"); } // Il se peut que les événements ne soient pas dans l'ordre, on utilise un tableau qui va référencer ce qui a vraiment été affiché // J'aurai pu utiliser cette variable dans la boucle while qui suit, mais en théorie, le total marche aussi $eventsAlreadySet = array(); // On commence par la colonne 1 $col = 1; // Tant que le total est supérieur à 0 while($eventsTotal > 0){ // On initialise la longueur du prochain événement $length = 1; // Pour chaque heure ... for($i=0; $i<24; $i++){ // On initialise le titre de l'événement $title = ""; // On regarde s'il y a un événement qui commence à cette heure for($j=0; $j<count($this->_events); $j++){ if($this->_events[$j]["timeStartHour"] == $i && !in_array($j, $eventsAlreadySet) && $length <= 1){ // On trouve un événement qui commence // Cet événement n'a pas encore été affiché // On n'est pas déjà dans la génération d'un événement $title = $this->_events[$j]["title"]; $titleSort = $this->_events[$j]["titleSort"]; $description = $this->_events[$j]["description"]; $link = $this->_events[$j]["link"]; $dateStart = $this->_events[$j]["dateStart"]; $style = $this->_events[$j]["style"]; $length = $this->_events[$j]["timeLengthHour"]; // On décrémente le total et on mémorise l'index de l'événement affiché $eventsTotal--; $eventsAlreadySet[] = $j; $j = count($this->_events); // ceci force la sortie de la boucle } } if(!empty($title)){ // Il y a un nouvel événement, on l'affiche $rows[$i][$col] = "<td class=\"".$style."\""; if($length > 1){ $rows[$i][$col] .= " rowspan=\"".$length."\""; } $rows[$i][$col] .= ">"; $rows[$i][$col] .= "<a href=\"".$link."\">".$titleSort."</a>"; $rows[$i][$col] .= "<dl class=\"description\">"; $rows[$i][$col] .= "<dt>".$dateStart." ".$title."</dt>"; $rows[$i][$col] .= "<dd>".$description."</dd>"; $rows[$i][$col] .= "</dl>"; $rows[$i][$col] .= "</td>"; }else{ // Il n'y a pas de nouvel événement à cette heure if($length <= 1 || !isset($length)){ // On n'est pas dans un rowspan, on peut donc afficher une cellule de tableau $rows[$i][$col] = "<td> </td>"; }else{ // On est dans la génération de l'événement, le rowspan n'a pas fini $length--; } } } // On va passer à la colonne suivante, si le test du while reste vrai $col++; } if(count($rows[0]) > 1){ // Il y a au moins une colonne d'événements $rowsTotal = count($rows[0]) - 1; if($rowsTotal > 1){ // Il y a plus d'une colonne d'événements for($i=1; $i<count($rows[0]); $i++){ $rows[0][$i] = str_replace("<td>", "<td class=\"width".(round(100 / $rowsTotal))."\">", $rows[0][$i]); } } }else{ // Il n'y a aucun événement for($i=0; $i<24; $i++){ $rows[$i][] = "<td> </td>"; } } // DL $content = "<dl"; if(!empty($this->_cssClass)){ $content .= " class=\"".$this->_cssClass."\""; } $content .= ">"; // DT $content .= "<dt>"; $content .= $this->_title; $content .= "</dt>"; // DD $content .= "<dd>"; $content .= "<table>"; $content .= "<tbody>"; for($i=0; $i<count($rows); $i++){ $content .= "<tr>"; $content .= implode("", $rows[$i]); $content .= "</tr>"; } $content .= "</tbody>"; $content .= "</table>"; $content .= "</dd>"; // DL fin $content .= "</dl>"; }else{ $content = "[CALENDAR DAY - ERROR]"; } $this->_html = $content; } /*===================== FIN = METHODES PRIVEES = FIN =====================*/ /*========================================================================*/ /*============================ GETTER SETTER ============================*/ /*========================================================================*/ public function __get($var){ switch($var){ case "html": $this->setHtml(); return $this->_html; case "title": return $this->_title; case "timeline": return $this->_timeline; default: return null; } } public function __set($var, $value){ switch($var){ case "title": $this->_title = (string) $value; break; case "timeline": $this->_timeline = (array) $value; break; default: } } /*====================== FIN = GETTER SETTER = FIN ======================*/ /*========================================================================*/ /*========================== METHODES PUBLIQUES ==========================*/ /*========================================================================*/ /** * Ajoute un événement * @param string $title Le titre de l'événement * @param int $timeStart L'heure de début, en minute depuis 00h00 * @param int $timeLength La durée, en minute * @param string $url Le lien de l'événement * @param string $decsription La description de l'événement * @param int $titleLength La taille maximale du titre * @param string $style Le style css de l'événement */ public function addEvent($title, $timeStart, $timeLength, $url, $description, $titleLength=20, $style="event"){ if(!isset($this->_events)){ $this->_events = array(); } $currentTitleLength = strlen($title); if($currentTitleLength > $titleLength){ $titleSort = preg_replace("/(&[^;]*)$/", "", substr($title, 0, $titleLength - 1))."…"; }else{ $titleSort = $title; } $timeStartHour = floor($timeStart / 60); $timeEndHour = ceil(($timeStart + $timeLength) / 60); $timeLengthHour = $timeEndHour - $timeStartHour; $dateHour = str_pad($timeStartHour, 2, "0", STR_PAD_LEFT); $dateMinute = str_pad($timeStart % 60, 2, "0", STR_PAD_LEFT); $dateStart = $dateHour.":".$dateMinute; // Il faut faire attention, il y a des risques de boucles infinies if($timeStartHour < 0 || $timeStartHour > 23){ $timeStartHour = 0; $title = "ERROR"; } $this->_events[] = array("titleSort"=>$titleSort, "title"=>$title, "timeStart"=>$timeStart, "timeStartHour"=>$timeStartHour, "timeEndHour"=>$timeEndHour, "timeLength"=>$timeLength, "timeLengthHour"=>$timeLengthHour, "dateStart"=>$dateStart, "link"=>$url, "description"=>$description, "style"=>$style); } /*==================== FIN = METHODES PUBLIQUES = FIN ====================*/ /*========================================================================*/ }