* @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("
".$this->_timeline[$i]." | ");
}
// 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_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] = " 1){ $rows[$i][$col] .= " rowspan=\"".$length."\""; }
$rows[$i][$col] .= ">";
$rows[$i][$col] .= "".$titleSort."";
$rows[$i][$col] .= "";
$rows[$i][$col] .= "- ".$dateStart." ".$title."
";
$rows[$i][$col] .= "- ".$description."
";
$rows[$i][$col] .= " ";
$rows[$i][$col] .= " | ";
}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] = " | ";
}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", "", $rows[0][$i]);
}
}
}else{
// Il n'y a aucun événement
for($i=0; $i<24; $i++){
$rows[$i][] = " | | ";
}
}
// DL
$content = "_cssClass)){
$content .= " class=\"".$this->_cssClass."\"";
}
$content .= ">";
// DT
$content .= "- ";
$content .= $this->_title;
$content .= "
";
// DD
$content .= "- ";
$content .= "
";
$content .= "";
for($i=0; $i_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 ====================*/
/*========================================================================*/
}
?>