com.neolao.components.CalendarDay

Composant HTML calendrier jour

Exemples

$calendar_day_view = new CalendarDay();
echo $calendar_day_view->html;

Propriétés

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

Méthodes

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

Change log

  • [06/05/2005] Version 1.0

Création

Source

/**
 * 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>&nbsp;</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>&nbsp;</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))."&hellip;";
		}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 ====================*/
	/*========================================================================*/
}