Blame | Last modification | View Log | RSS feed
<?php// +------------------------------------------------------------------------------------------------------+// | PHP version 5.1.1 |// +------------------------------------------------------------------------------------------------------+// | Copyright (C) 2006 Tela Botanica (accueil@tela-botanica.org) |// +------------------------------------------------------------------------------------------------------+// | This file is part of eFlore. |// | |// | Foobar is free software; you can redistribute it and/or modify |// | it under the terms of the GNU General Public License as published by |// | the Free Software Foundation; either version 2 of the License, or |// | (at your option) any later version. |// | |// | Foobar is distributed in the hope that it will be useful, |// | but WITHOUT ANY WARRANTY; without even the implied warranty of |// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |// | GNU General Public License for more details. |// | |// | You should have received a copy of the GNU General Public License |// | along with Foobar; if not, write to the Free Software |// | Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |// +------------------------------------------------------------------------------------------------------+// CVS : $Id$/*** Classe Calendrier** Description**@package Calendrier//Auteur original :*@version 1*@author Dorian BANNIER <dbannier@aol.com>//Autres auteurs :*@version 3*@author Shaheen ABDOOL RAHEEM <shaheenar50@hotmail.com>*@version 4*@author Jean-Pascal MILCENT <jpm@clapas.org>*@author aucun*@copyright Tela-Botanica 2000-2006*@version $Revision$ $Date$// +------------------------------------------------------------------------------------------------------+*//*** Classe calendrier pour gerer le calendrier pour un mois et une annee**@param annee*@param mois*@param premier jour du mois*@param semaine*@param l'url du resultat affiche*@param liste de noms des jours*@param liste de noms des mois*@param liste des jours feries du mois*/class Calendrier{private $annee;private $mois;private $semaine;private $jour;private $nom_jours = array();private $nom_mois = array();private $liste_feries = array();/** contient le nom des variables que recevra l'url spécifié* @var string*/var $var_jour = "jour";var $var_mois = "mois";var $var_annee = "annee";/***constructeur de la classe calendrier*toutes les variables sont initialises avec les donnees*de la date du jour si on ne passe aucune date en parametre*sinon on initialise le calendrier avec*@param semaine*@param annee*/public function __construct($semaine = null, $annee = null){if (is_null($semaine)) {$semaine = date('W', time());}if (is_null($annee)) {// TODO : vérifier le standard ISO-8601$annee = date('Y', time());}$tableau = $this->donnerLundiEtDimancheSemaine($semaine, $annee);$this->jour = date('d',mktime(0,0,0,1,$tableau[0],$annee));$this->semaine = $semaine;$this->mois = date('n',mktime(0,0,0,1,$tableau[0],$annee));$this->annee = $annee;$this->nom_jours = array (GESTION_LUN_L, GESTION_MAR_L, GESTION_MER_L, GESTION_JEU_L, GESTION_VEN_L, GESTION_SAM_L ,GESTION_DIM_L);$this->nom_mois = array(1 => "Janvier","Février","Mars","Avril","Mai","Juin","Juillet", "Août","Septembre","Octobre","Novembre","Décembre");$this->liste_feries = $this->calculerJoursFeries($this->annee);}public function getAnnee(){return $this->annee;}public function getMois(){return $this->mois;}public function getSemaine(){return $this->semaine;}public function getJour(){return $this->jour;}/***Calcule les dates des jours fériés pour la france.*Renvoie un tableau contenant la liste de dates par mois.*Les dates sont de la forme timestamp unix.**@param integer l'année pour laquelle on veut les jours fériés.*@return array tableau des dates fériées.*/public function calculerJoursFeries($annee){$tab = array( mktime(0,0,0,1,1,$annee),$this->donnerDatePaques($annee),mktime(0,0,0,5,1,$annee),mktime(0,0,0,5,8,$annee),$this->donnerDateAscension($annee),$this->donnerDatePentecote($annee),mktime(0,0,0,7,14,$annee),mktime(0,0,0,8,15,$annee),mktime(0,0,0,11,1,$annee),mktime(0,0,0,11,11,$annee),mktime(0,0,0,12,25,$annee));return $tab;}/***Calcule la date du lundi de Pâques.**@param integer l'année pour laquelle on veut connaître la date de Pâques*@return integer le timestamp du lundi de Pâques*/public function donnerDatePaques($annee){$date_paques = easter_date($annee);$lundi_paques = mktime( date("H", $date_paques),date("i", $date_paques),date("s", $date_paques),date("m", $date_paques),date("d", $date_paques) + 1,date("Y", $date_paques));return $lundi_paques;}/***Calcule la date de l'ascension.**@param integer l'année pour laquelle on veut connaître la date de l'ascencion*@return integer le timestamp de l'ascencion*/public function donnerDateAscension($annee){$date_paques = easter_date($annee);$date_ascension = mktime( date("H", $date_paques),date("i", $date_paques),date("s", $date_paques),date("m", $date_paques),date("d", $date_paques) + 39,date("Y", $date_paques));return $date_ascension;}/***Calcule la date du lundi de la pentecote*Renvoie un timestamp*renvoie cette derniere*/public function donnerDatePentecote($annee){$date_paques = easter_date($annee);$date_ascension = $this->donnerDateAscension($annee);$date_pentecote = mktime( date("H", $date_ascension),date("i", $date_ascension),date("s", $date_ascension),date("m", $date_ascension),date("d", $date_ascension) + 11,date("Y", $date_ascension));return $date_pentecote;}/***Donne le type de jour de la semaine au format numérique du premier jour du mois.**@return integer le numéro de 1 (lundi) à 7 (dimanche) correspondant au type du premier jour du mois.*/function donnerTypePremierJourMois(){$intPremierJour = date("w", mktime(0, 0, 0, $this->getMois(), 1, $this->getAnnee()));if ($intPremierJour == 0) {$intPremierJour = 7; // si c'est un dimanche}return $intPremierJour;}/***Calcule le dernier jour du mois*@param : annee, mois*renvoie un entier*/function donnerDernierJourMois(){$h = $this->donnerNbreJoursMois();$intDernierJour = date("w", mktime(0, 0, 0, $this->getMois(), $h, $this->getAnnee()));if($intDernierJour == 0) {$intDernierJour = 7; // si c'est un dimanche}return $intDernierJour;}/***Calcule le nombre de jours dans un mois*@return integer le nombre de jour dans le mois.*/function donnerNbreJoursMois(){return date("t", mktime(0, 0, 0, $this->getMois(), 1, $this->getAnnee()));}/***Calcule la semaine suivante*/function donnerSemaineSuivante(){if ($this->getSemaine() == date('W', mktime(0, 0, 0, 12, 31, $this->getAnnee()))) {$tab['semaine'] = 1;$tab['annee'] = $this->getAnnee() + 1;} else {$tab['semaine'] = $this->getSemaine() + 1;$tab['annee'] = $this->getAnnee();}return $tab;}/***Calule la semaine précédente*/function donnerSemainePrecedente(){if ($this->getSemaine() == 1) {$tab['semaine'] = date('W', mktime(0, 0, 0, 12, 31, ($this->getAnnee() - 1)));$tab['annee'] = $this->annee - 1;} else {$tab['semaine'] = $this->semaine - 1 ;$tab['annee'] = $this->annee;}return $tab;}/***Calucule le mois suivant*renvoie l'annee et le mois suivant sous forme de chiffre*dans un tableau*/function donnerMoisSuivant(){if ($this->mois == 12) {$tab['mois'] = 1;$tab['annee'] = $this->annee + 1;} else {$tab['mois'] = $this->mois + 1;$tab['annee'] = $this->annee;}return $tab;}/***Calcule le mois precedent*renvoie l'annee et le mois precedent sous forme de chiffre*/function donnerMoisPrecedent(){if ($this->mois == 1) {$tab['mois'] = 12;$tab['annee'] = $this->annee - 1;} else {$tab['mois'] = $this->mois - 1;$tab['annee'] = $this->annee;}return $tab;}/***Renvoie la date du lundi et dimanche d'une semaine*a partir du numero de semaine**@return un tableau contenat le timestamp unix de lundi et dimanche*de la semaine en question*/function donnerLundiEtDimancheSemaine(){if ((date("w", mktime(0, 0, 0, 1, 1, $this->getAnnee())) <= 4) && (date("w", mktime(0, 0, 0, 1, 1, $this->getAnnee())) != 0)) {$nbre_jour = ($this->getSemaine() - 1) * 7;} else {$nbre_jour = ($this->getSemaine()) * 7;}if (date("w", mktime(0, 0, 0, 1, 1, $this->getAnnee())) == 0) {$nbre_jour += 7;} else {$nbre_jour += 7 - ((date("w", mktime(0, 0, 0, 1, 1, $this->getAnnee())) - 1) % 7);}$nbre_jour_7 = $nbre_jour - 6;return array($nbre_jour_7, $nbre_jour);}/***Indique si une date est fériée ou non*renvoie 1 si férié*0 sinon*/function etreFerie($date){if (in_array($date, $this->liste_feries)) {return 1;} else {return 0;}}/***Affiche un calendrier naviguable par semaine*option pour cliquer sur une semaine donnee*utilisation de la bibliotheque HTML/TABLE de PEAR*@param numero de semaine et annee*/function afficherCalendrier($annee){$id="CALENDRIER";$text=/*"</tr></td>".*/"<div id=\"calendrier\">";//initialisation des donnees$intPremierJour = &Calendrier::premierJourMois($this->mois,$this->annee);$intNbJoursMois = &Calendrier::nbJourMois($this->mois,$this->annee);$prevMonth=&Calendrier::prevMonth($this->mois,$this->annee);$intNbJourPrec=&Calendrier::nbJourMois($prevMonth[0],$prevMonth[1]);$intDernierJour=&Calendrier::dernierJourMois($this->mois,$this->annee);//calcul du lundi et dimanche de la semaine courante//calcul de l'annee$tabLundiDimanche =& Calendrier::lundiEtDimancheSemaine($this->semaine,$annee);//creation de la table HTML representant le calendrier$tableAttrs = array("class" =>$id,"width" => "300");//creation de la barre de navigation//semaine precedente$tabPrevWeek=&Calendrier::prevWeek();$text.="<a href=".$GLOBALS['urlBase'].GESTION_TRAVAIL."&semaine=";$text.=$tabPrevWeek[0]."&annee=".$tabPrevWeek[1].">";$text.="<<"."</a>";//semaine courante$text.='<button>';$text.=date('d/m/y',mktime(0,0,0,1,$tabLundiDimanche[0],$annee));$text.=' -- ';$text.=date('d/m/y',mktime(0,0,0,1,$tabLundiDimanche[1],$annee));$text.='</button>';//semaine suivante$tabNextWeek= &Calendrier::nextWeek();$text.="<a href=".$GLOBALS['urlBase'].GESTION_TRAVAIL."&semaine=";$text.=$tabNextWeek[0]."&annee=".$tabNextWeek[1].">";$text.=">>"."</a>";$table = new HTML_Table($tableAttrs);$table -> setAutoGrow(true);$table->addRow($this->nom_jours);//remplissage de la premiere ligne//test si on est dans la semaine courante//si dimanche egale a la fin de la semaine$semCourante=(date('d',mktime(0,0,0,1,$tabLundiDimanche[1],$annee))==(7-$intPremierJour+1));$p=1;for($i=1; $i<=7;$i++) {if ($i<$intPremierJour and $semCourante) {//mois prec et semaine courante$elem[$i-1]="<div id=\"moisprecedent\">".($intNbJourPrec-$intPremierJour+$i+1);} elseif ($i<$intPremierJour and !$semCourante) {//mois prec et pas semaien courante$semaineL=date('W',mktime(0,0,0,$prevMonth[0],($intNbJourPrec-$intPremierJour+$i+1),$prevMonth[1]));$elem[$i-1]= "<a href=".$this->url."?action=".GESTION_TRAVAIL."&semaine=$semaineL"."&annee=$prevMonth[1]".">".($intNbJourPrec-$intPremierJour+$i+1)."</a>";} elseif ($i>=$intPremierJour and $semCourante) {//mois courant et semaine courante$elem[$i-1] = "<div id=\"jourcourant\">".$p."</div>";$p++;} else {//mois courant et pas semaine courante$semaineL=date('W',mktime(0,0,0,$this->mois,$p,$this->annee));$elem[$i-1] = "<a href=".$this->url."?action=".GESTION_TRAVAIL."&semaine=$semaineL";$elem[$i-1] .="&annee=".$this->annee.">".$p."</a>";$p++;}}$table->addRow($elem);//remplissage du reste des lignes$i=0; //indice du tableau//lundi de la semaien courante// $t=&Calendrier::lundiEtDimancheSemaine($this->semaine,$this->annee);$lundiCourant=date('d',mktime(0,0,0,1,$tabLundiDimanche[0],$annee));$semCourante2=0;for ($f=$p; $f<=$intNbJoursMois ; $f++) {if ($f==$lundiCourant and $i==0) {$semCourante2=1;//booleen}//calcul de la semaine courante$semaineL2=date('W',mktime(0,0,0,$this->mois,$f,$this->annee));if ($semCourante2==1) {$elem[$i]= "<div id=\"jourcourant\">".$f."</div>";} else {$elem[$i]="<a href=".$this->url."?action=".GESTION_TRAVAIL."&semaine=$semaineL2";$elem[$i].="&annee=".$this->annee.">".$f."</a>";}if ($i==6) {$i=0;if ($semCourante2==1) {$semCourante2=0;}$table->addRow($elem);} else {$i++;}}//remplissage de la derniere ligne$semaineL3=date('W',mktime(0,0,0,$this->mois,$intNbJoursMois,$this->annee));if ($semCourante2==0) {for ($d=$i; $d<=6;$d++) {$s=$d-$i+1;$elem[$d]="<a href=".$this->url."?action=".GESTION_TRAVAIL."&semaine=$semaineL2";$elem[$d].="&annee=".$this->annee.">".$s."</a>";}} else {for ($d=$i; $d<=6;$d++) {$elem[$d]= ($d-$i+1);}}$table->addRow($elem);$text.=$table->toHtml();$text .= "</div>";return $text;}}?>