com.neolao.components.CalendarYear

Composant HTML calendrier année

Exemples

$calendar_year_view = new CalendarYear();
echo $calendar_year_view->html;

Propriétés

Visibilité Type Nom Status Description
public string title Titre du composant
public array dayNames Les noms des jours de la semaine
public string dayLinkFormat Le format des liens des jours (pour sprintf)
public array monthNames Les noms des mois de l'année
public int year L'année du calendrier
public string html Lecture seule L'affichage HTML du calendrier

Méthodes

Visibilité Nom Param 1 Param 2 Param 3 Param 4 Param 5 Param 6 Param 7 Description
public addEvent string $title int $startMonth int $starDay int $length string $url string $description string $style Ajoute un événement
public addNextYear $url Ajoute un lien “année suivante”
public removeNextYear Supprime le lien “année suivante”
public addPreviousYear $url Ajoute un lien “année précédente”
public removePreviousYear Supprime le lien “année précédente”

Change log

  • [08/05/2005] Version 1.0

Création

  • [10/05/2005] Version 1.1

Correction de setHtml :
Si on ne définit aucun événement, le each($this→_events) renvoi une erreur parce que la variable n'a jamais été défini

Source

/**
 * Composant html calendrier année
 * @package		com.neolao
 * @subpackage		components
 * @author		neolao <neo@neolao.com>
 * @version		1.0 (10/05/2005)
 * @link		http://resources.neolao.com/php/classes/components/calendaryear
 */
class CalendarYear {
	// ----------------------------- CONSTANTES --------------------------------
 
	// ----------------------------- VARIABLES ---------------------------------
	/**
	 * Le style CSS du composant (class)
	 * @var string
	 */
	private $_cssClass;
	/**
	 * Le titre du composant
	 * @var string
	 */
	private $_title;
	/**
	 * Les mois de l'année
	 * @var array
	 */
	private $_monthNames;
	/**
	 * Les jours de la semaine
	 * @var array
	 */
	private $_dayNames;
	/**
	 * Le format des liens des jours (pour sprintf)
	 * @var string
	 */
	private $_dayLinkFormat;
	/**
	 * L'année
	 * @var int
	 */
	private $_year;
	/**
	 * Le lien "année suivante"
	 * @var string
	 */
	private $_nextYearLink;
	/**
	 * Le lien "année précédente"
	 * @var string
	 */
	private $_previousYearLink;
	/**
	 * Les événements
	 * @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->_dayNames = array("S", "M", "T", "W", "T", "F", "S");
		$this->_dayLinkFormat = "#";
		$this->_monthNames = array("January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December");
		$this->_year = date("Y");
	}
	/**
	 * 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
		$year = date("Y", mktime(0, 0, 0, 1, 1, $this->_year));
		$checkEvents = true;
		$eventsTotal = 0;
		if(isset($this->_events)){
			while (list($i, $v1) = each($this->_events)) {
				// Pour chaque mois ...
				while (list($j, $v2) = each($v1)) {
					// Pour chaque jour ...
					while (list($k, $v3) = each($v2)) {
						// Pour chaque événement du jour ...
						$eventsTotal++;
						if(!checkdate($v3["month"], $v3["day"], $year)){
							$checkEvents = false;
						}
					}
				}
			}
		}
		$ok = $checkEvents;
 
		if($ok){
			// Génération des variables utiles
			// liste des événements déjà insérés
			$eventsAlreadySet = array();
			// tableau à 2 niveaux : mois, jours
			$rows = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12);
			for($i=0; $i<count($rows); $i++){
				// Pour chaque mois ...
				$rows[$i] = array();
				$dayTotal = date("t", mktime(0, 0, 0, $i+1, 1, $year));
				for($j=0; $j<$dayTotal; $j++){
					// Pour chaque jour ...
					$dayNameIndex = date("w", mktime(0, 0, 0, $i+1, $j+1, $year));
					$rows[$i][$j] = "<a href=\"".sprintf($this->_dayLinkFormat, $year, $i+1, $j+1)."\">".substr($this->_dayNames[$dayNameIndex], 0, 1)."</a>";
				}
			}
			// génération de ce tableau
			while($eventsTotal > 0){
				// On initialise la longueur du prochain événement
				$length = 0;
 
				// Pour chaque mois ...
				for($i=1; $i<=12; $i++){
					// Pour chaque jour de ce mois ...
					for($j=1; $j<=count($rows[$i - 1]); $j++){
						// On vérifie s'il existe un événement à cette date
						if($length == 0 && isset($this->_events[$i][$j])){
							for($k=0; $k<count($this->_events[$i][$j]); $k++){
								// Pour chaque événement de ce jour ...
								if(!$eventsAlreadySet[$i][$j][$k]){
									// Le contenu html
									$row = "<div class=\"".$this->_events[$i][$j][$k]["style"]."\">&nbsp;</div>";
									$rowFirst = "<div class=\"".$this->_events[$i][$j][$k]["style"]."\">";
									$rowFirst .= "<a href=\"".$this->_events[$i][$j][$k]["link"]."\">&bull;</a>";
									$rowFirst .= "<dl class=\"description\">";
									$rowFirst .= 	"<dt>".$this->_events[$i][$j][$k]["title"]."</dt>";
									$rowFirst .= 	"<dd>".$this->_events[$i][$j][$k]["description"]."</dd>";
									$rowFirst .= "</dl>";
									$rowFirst .= "</div>";
									// La durée de l'événement
									$length = $this->_events[$i][$j][$k]["length"];
									$maxLength = $length;
									// On mémorise l'événement
									if(!isset($eventsAlreadySet[$i])){
										$eventsAlreadySet[$i] = array();
									}
									if(!isset($eventsAlreadySet[$i][$j])){
										$eventsAlreadySet[$i][$j] = array();
									}
									$eventsAlreadySet[$i][$j][$k] = true;
									// On décrémente le total des événements
									$eventsTotal--;
									// On sort de la boucle des événements
									$k = count($this->_events[$i][$j]);
								}
							}
						}
						if($length < 1){
							// On n'est pas dans un événement
							$rows[$i - 1][$j - 1] .= "<div>&nbsp;</div>";
						}else{
							// On est dans un événement
							$rows[$i - 1][$j - 1] .= ($length == $maxLength)?$rowFirst:$row;
							$length--;
						}
					}
				}
			}
 
			// DL
			$content = "<dl";
			if(!empty($this->_cssClass)){
				$content .= " class=\"".$this->_cssClass."\"";
			}
			$content .= ">";
 
			// DT
			$content .= "<dt>";
			if(!empty($this->_previousYearLink)){
				$content .= "<a class=\"previousYearLink\" href=\"".$this->_previousYearLink."\">&lt;&lt;</a>";
			}
			$content .= $this->_title;
			if(!empty($this->_nextYearLink)){
				$content .= "<a class=\"nextYearLink\" href=\"".$this->_nextYearLink."\">&gt;&gt;</a>";
			}
			$content .= "</dt>";
 
			// DD
			$content .= "<dd>";
			// premier semestre
			$content .= 	"<table>";
			$content .= 		"<thead>";
			$content .= 			"<tr>";
			for($i=0; $i<6; $i++){
				$content .= 			"<th class=\"width17\">".$this->_monthNames[$i]."</th>";
			}
			$content .= 			"</tr>";
			$content .= 		"</thead>";
			$content .= 		"<tfoot>";
			$content .= 			"<tr>".str_repeat("<td>&nbsp;</td>", 6)."</tr>";
			$content .= 		"</tfoot>";
			$content .= 		"<tbody>";
			$content .= 			"<tr>";
			// De janvier à juin ...
			for($i=1; $i<=6; $i++){
				$content .= 			"<td>";
				$content .= 				"<ol>";
				// Pour chaque jour du mois ...
				for($j=1; $j<=count($rows[$i - 1]); $j++){
					$content .= 				"<li class=\"".strtolower(date("l", mktime(0, 0, 0, $i, $j, $year)))."\">".$rows[$i - 1][$j - 1]."</li>";
				}
				$content .= 				"</ol>";
				$content .= 			"</td>";
			}
			$content .= 			"</tr>";
			$content .= 		"</tbody>";
			$content .= 	"</table>";
			// second semestre
			$content .= 	"<table>";
			$content .= 		"<thead>";
			$content .= 			"<tr>";
			for($i=6; $i<12; $i++){
				$content .= 			"<th class=\"width17\">".$this->_monthNames[$i]."</th>";
			}
			$content .= 			"</tr>";
			$content .= 		"</thead>";
			$content .= 		"<tfoot>";
			$content .= 			"<tr>".str_repeat("<td>&nbsp;</td>", 6)."</tr>";
			$content .= 		"</tfoot>";
			$content .= 		"<tbody>";
			$content .= 			"<tr>";
			// De juillet à décembre ...
			for($i=7; $i<=12; $i++){
				$content .= 			"<td>";
				$content .= 				"<ol>";
				// Pour chaque jour du mois ...
				for($j=1; $j<=count($rows[$i - 1]); $j++){
					$content .= 				"<li class=\"".strtolower(date("l", mktime(0, 0, 0, $i, $j, $year)))."\">".$rows[$i - 1][$j - 1]."</li>";
				}
				$content .= 				"</ol>";
				$content .= 			"</td>";
			}
			$content .= 			"</tr>";
			$content .= 		"</tbody>";
			$content .= 	"</table>";
			$content .= "</dd>";
 
			// DL fin
			$content .= "</dl>";
		}else{
			$content = "[CALENDAR YEAR - 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 "dayNames":
				return $this->_dayNames;
			case "dayLinkFormat":
				return $this->_dayLinkFormat;
			case "monthNames":
				return $this->_monthNames;
			case "year":
				return $this->_year;
			default:
				return null;
		}
	}
	public function __set($var, $value){
		switch($var){
			case "title":
				$this->_title = (string) $value;
				break;
			case "dayNames":
				$this->_dayNames = (array) $value;
				break;
			case "dayLinkFormat":
				// pour sprintf, le premier arguments des l'année %d, puis le mois %d et enfin le jour %d
				$this->_dayLinkFormat = (string) $value;
				break;
			case "monthNames":
				$this->_monthNames = (array) $value;
				break;
			case "year":
				$this->_year = (int) $value;
				break;
			default:
 
		}
	}
	/*====================== FIN = GETTER  SETTER = FIN ======================*/
	/*========================================================================*/
 
	/*========================== METHODES PUBLIQUES ==========================*/
	/*========================================================================*/
	/**
	 * Ajoute un événement
	 * @param string $title Le titre de l'événement
	 * @param int $startMonth Le mois de l'événement
	 * @param int $startDay Le jour de l'événement
	 * @param int $length La durée de l'événement, en jour
	 * @param string $url Le lien de l'événement
	 * @param string $description La description de l'événement
	 * @param string $style Le style css de l'événement
	 */
	public function addEvent($title, $startMonth, $startDay, $length, $url, $description, $style="event"){
		if(!isset($this->_events)){
			$this->_events = array();
		}
		$startMonth = ($startMonth >=1 && $startMonth <=12)?(int)$startMonth:1;
		$startDay = ($startDay >=1 && $startDay <=31)?(int)$startDay:1;
		if(!isset($this->_events[$startMonth])){
			$this->_events[$startMonth] = array();
		}
		if(!isset($this->_events[$startMonth][$startDay])){
			$this->_events[$startMonth][$startDay] = array();
		}
		$length = ($length >= 1)?(int)$length:1;
 
		$this->_events[$startMonth][$startDay,][] = array("title"=>$title, 
								"month"=>$startMonth, 
								"day"=>$startDay, 
								"length"=>$length, 
								"link"=>$url, 
								"description"=>$description, 
								"style"=>$style);
	}
 
	/**
	 * Ajoute un lien "année suivante"
	 * @param string $url Le contenu du lien (contenu du href)
	 */
	public function addNextYear($url){
		$this->_nextYearLink = $url;
	}
	/**
	 * Supprime le lien "année suivante"
	 */
	public function removeNextYear(){
		$this->_nextYearLink = null;
	}
 
	/**
	 * Ajoute un lien "année précédente"
	 * @param string $url Le contenu du lien (contenu du href)
	 */
	public function addPreviousYear($url){
		$this->_previousYearLink = $url;
	}
	/**
	 * Supprime le lien "année précédente"
	 */
	public function removePreviousYear(){
		$this->_previousYearLink = null;
	}
	/*==================== FIN = METHODES PUBLIQUES = FIN ====================*/
	/*========================================================================*/
}