* @version 1.1 (12/05/2005)
* @link http://resources.neolao.com/php/classes/components/calendar
*/
class Calendar {
// ----------------------------- CONSTANTES --------------------------------
// ----------------------------- VARIABLES ---------------------------------
/**
* L'année
* @var int
*/
private $_year;
/**
* Le mois
* @var int
*/
private $_month;
/**
* Le jour mis en valeur
* @var int
*/
private $_day;
/**
* Les jours de la semaine
* @var array
*/
private $_dayNames;
/**
* Les liens des jours
* @var array
*/
private $_dayLinks;
/**
* Les mois de l'année
* @var array
*/
private $_monthNames;
/**
* Indique le premier jour de la semaine
* @var int
*/
private $_weekFirstDay;
/**
* Le lien "mois suivant"
* @var string
*/
private $_nextMonthLink;
/**
* Le lien "mois précédent"
* @var string
*/
private $_previousMonthLink;
/**
* Le lien "année suivante"
* @var string
*/
private $_nextYearLink;
/**
* Le lien "année précédente"
* @var string
*/
private $_previousYearLink;
/**
* Les événements du mois
* @var array
*/
private $_events;
/**
* Le style CSS du composant (class)
* @var string
*/
private $_cssClass;
/**
* 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->_dayNames = array("S", "M", "T", "W", "T", "F", "S");
$this->_monthNames = array("January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December");
$this->_weekFirstDay = 0; // 0 = Sunday
$this->_year = (int) date("Y");
$this->_month = (int) date("n");
$this->_day = (int) date("j");
$this->_events = array();
}
/**
* Destruction de la class
*/
function __destruct(){
}
/*=============== FIN = CONSTRUCTEUR & DESCTRUCTEUR = FIN ================*/
/*========================================================================*/
/*=========================== METHODES PRIVEES ===========================*/
/*========================================================================*/
/**
* Génération du html
*/
private function _setHtml(){
$ok = false;
// Vérification de la validité des variables qui vont être utilisées
if(checkdate($this->_month, $this->_day, $this->_year)){
// La date existe
if(count($this->_dayNames) == 7){
// Il y a bien 7 noms de jour de semaine
if(count($this->_monthNames) == 12){
// Il y a bien 12 noms de mois
if($this->_weekFirstDay >=0 && $this->_weekFirstDay <=6){
// Le premier jour de la semaine est valide
$ok = true;
}
}
}
}
if($ok){
// Génération des variables utiles
$dayFirst = date("w", mktime(0, 0, 0, $this->_month, 1, $this->_year));
$dayTotal = date("t", mktime(0, 0, 0, $this->_month, 1, $this->_year));
$days = array();
$i = 1; // nombre de jour du mois créé
$n = 0; // semaine
while($i <= $dayTotal){
$days[$n] = array();
for($j=0; $j<7; $j++){
if($i > 1 || ($n == 0 && $j == ($dayFirst + 7 - $this->_weekFirstDay)%7)){
if($i <= $dayTotal){
$days[$n][$j] = $i++;
}else{
$days[$n][$j] = "";
}
}else{
$days[$n][$j] = "";
}
}
$n++;
}
// DL
$content = "
_cssClass)){
$content .= " class=\"".$this->_cssClass."\"";
}
$content .= ">";
// DT
$content .= "- ";
if(!empty($this->_previousYearLink)){
$content .= "_previousYearLink."\"><<";
}
if(!empty($this->_previousMonthLink)){
$content .= "_previousMonthLink."\"><";
}
$content .= $this->_monthNames[$this->_month - 1]." ".$this->_year;
if(!empty($this->_nextMonthLink)){
$content .= "_nextMonthLink."\">>";
}
if(!empty($this->_nextYearLink)){
$content .= "_nextYearLink."\">>>";
}
$content .= "
";
// DD
$content .= "- ";
$content .= "
";
$content .= "";
for($i=0; $i_dayNames); $i++){
$content .= "| ".$this->_dayNames[($i + $this->_weekFirstDay)%7]." | ";
}
$content .= "
";
$content .= "";
for($i=0; $i_dayNames); $i++){
$content .= "| | ";
}
$content .= "
";
$content .= "";
for($i=0; $i_day){
// C'est le jour sélectionné
$content .= " class=\"light\"";
}else if($this->_events[$days[$i][$j]] === true){
// Il n'est pas sélectionné mais il y a au moins un événement
$content .= " class=\"event\"";
}
$content .= ">";
if(!empty($this->_dayLinks[$days[$i][$j]])){
$content .= "_dayLinks[$days[$i][$j]]."\">".$days[$i][$j]."";
}else{
$content .= $days[$i][$j];
}
$content .= "";
}
$content .= "";
}
$content .= "";
$content .= "
";
$content .= " ";
// DL fin
$content .= "
";
}else{
$content = "[CALENDAR - ERROR]";
}
$this->_html = $content;
}
/*===================== FIN = METHODES PRIVEES = FIN =====================*/
/*========================================================================*/
/*============================ GETTER SETTER ============================*/
/*========================================================================*/
public function __get($var){
switch($var){
case "html":
$this->_setHtml();
return $this->_html;
case "firstDay":
return $this->_weekFirstDay;
case "dayNames":
return $this->_weekDays;
case "monthNames":
return $this->_monthNames;
case "year":
return $this->_year;
case "month":
return $this->_month;
case "day":
return $this->_day;
default:
return null;
}
}
public function __set($var, $value){
switch($var){
case "firstDay":
$this->_weekFirstDay = (int) $value % 7;
break;
case "dayNames":
$this->_dayNames = (array) $value;
break;
case "monthNames":
$this->_monthNames = (array) $value;
break;
case "year":
$this->_year = (int) $value;
$timestamp = mktime(0, 0, 0, $this->_month, $this->_day, $this->_year);
$this->_year = date("Y", $timestamp);
$this->_month = date("m", $timestamp);
$this->_day = date("d", $timestamp);
break;
case "month":
$this->_month = (int) $value;
$timestamp = mktime(0, 0, 0, $this->_month, $this->_day, $this->_year);
$this->_year = date("Y", $timestamp);
$this->_month = date("m", $timestamp);
$this->_day = date("d", $timestamp);
break;
case "day":
$this->_day = $value;
$timestamp = mktime(0, 0, 0, $this->_month, $this->_day, $this->_year);
$this->_year = date("Y", $timestamp);
$this->_month = date("m", $timestamp);
$this->_day = date("d", $timestamp);
break;
default:
}
}
/*====================== FIN = GETTER SETTER = FIN ======================*/
/*========================================================================*/
/*========================== METHODES PUBLIQUES ==========================*/
/*========================================================================*/
/**
* Ajoute un événement à un jour
* Ca ne rajoute qu'un style à la case
* @param int $dayNumber Le jour de l'événement
*/
public function addEvent($dayNumber){
if(!isset($this->_events)){
$this->_events = array();
}
$this->_events[$dayNumber] = true;
}
/**
* Ajoute un lien à un jour du mois
* @param int $dayNumber Le numéro du mois
* @param string $url Le contenu du lien (contenu du href)
*/
public function addLink($dayNumber, $url){
if(!isset($this->_dayLinks)){
$this->_dayLinks = array();
}
$this->_dayLinks[$dayNumber] = $url;
}
/**
* Supprime un lien à un jour du mois
* @param int $dayNumber Le numéro du mois
*/
public function removeLink($dayNumber){
if(!isset($this->_dayLinks)){
$this->_dayLinks = array();
}
$this->_dayLinks[$dayNumber] = null;
}
/**
* Ajoute un lien "mois suivant"
* @param string $url Le contenu du lien (contenu du href)
*/
public function addNextMonth($url){
$this->_nextMonthLink = $url;
}
/**
* Supprime le lien "mois suivant"
*/
public function removeNextMonth(){
$this->_nextMonthLink = null;
}
/**
* Ajoute un lien "mois précédent"
* @param string $url Le contenu du lien (contenu du href)
*/
public function addPreviousMonth($url){
$this->_previousMonthLink = $url;
}
/**
* Supprime le lien "mois précédent"
*/
public function removePreviousMonth(){
$this->_previousMonthLink = null;
}
/**
* 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 ====================*/
/*========================================================================*/
}
?>