Class calendrier et jours fris--------------------------------
Url     : http://codes-sources.commentcamarche.net/source/52357-class-calendrier-et-jours-feriesAuteur  : beemoonDate    : 13/08/2013
Licence :
=========

Ce document intitul  Class calendrier et jours fris  issu de CommentCaMarche
(codes-sources.commentcamarche.net) est mis  disposition sous les termes de
la licence Creative Commons. Vous pouvez copier, modifier des copies de cette
source, dans les conditions fixes par la licence, tant que cette note
apparat clairement.

Description :
=============

Je me teste &agrave; la POO en php voici donc ma premi&egrave;re r&eacute;alisat
ion qui est une n_ieme class pour un calendrier. C'est plus pour un exercice et 
des commentaires pour progresser que je mets ce code.
<br />
<br />Il ne perme
t pas de g&eacute;n&eacute;rer graphiquement un calendrier mais de g&eacute;n&ea
cute;rer des dates pour les exploiter apr&egrave;s.
<br />Les dates sont config
urables par fichier le conf.ini
<br />Vous pouvez g&eacute;n&eacute;rer la plag
e de calendrier que vous voulez.
<br />un fichier mainTest.php est joint pour t
ester et une d&eacute;mo de ce qui peut etre g&eacute;n&eacute;r&eacute;.
<br /
>
<br />NB: Il faudrait revoir tout le code pour passer au Datetime, donc pour 
une peut etre future version.
<br /><a name='source-exemple'></a><h2> Source / 
Exemple : </h2>

<br /><pre class='code' data-mode='basic'>
==&gt; Clas

&lt
;?php
/**

<ul><li> Generation des dates pour realiser un calendrier</li></ul
>
*

<ul><li> Cette class genere toutes les dates necessaire pour realiser un
 calendrier
</li><li> les dates sont retournees sous forme array()
</li><li> l
es dates generees sont :
</li><li> 		- tous les jours de la periode du calendri
er passee en parametre
</li><li> 		- tous les weekends de la periode du calendr
ier passee en parametre
</li><li> 		- tous les jours feries fixes francais de l
a periode du calendrier passee en parametre
</li><li> 		- tous les jours feries
 variables (paques, pentecote,ascension) de la periode du calendrier passee en p
arametre
</li><li>		- le cumul par ordre chronologique croissant des jours feri
es</li></ul>
*

<ul><li> @version 1.0
</li><li> @author BRIZARD Olivier &lt;
o.brizard@gmail.com&gt;
</li><li> @link <a href='http://www.beemoon.fr' target=
'_blank'>http://www.beemoon.fr</a>
</li><li> @copyright Copyright (c) 2010, BRI
ZARD Olivier
</li><li> @license <a href='http://creativecommons.org/licenses/by
-sa/2.0/fr/' target='_blank'>http://creativecommons.org/licenses/by-sa/2.0/fr/</
a>
</li><li>/</li></ul>

class Calendrier{
	
	// Les attributs prives retou
rnes par __get()
	private $_lesJours;
	private $_lesWeekends;
	private $_lesA
nnees;
	private $_lesFeriesFixes;
	private $_lesFeriesVariables;
	private $_t
ousLesFeries;
	private $_toutLeCalendrier;
	
	// Les attributs prives non ret
ournes
	private $_dateDeb;
	private $_dateFin;	
	private $_config = &quot;con
f.ini&quot;;	     
	private $configFile = array();
	    
   	public function 
__construct($date_deb,$date_fin){
   		// Controle que le module Calendar est c
harg
   		if (!extension_loaded(&quot;calendar&quot;)) {echo &quot;Cette class
 utilise les fonctions de Calendar.&quot;;exit();}
   		
  		// Chargement du 
fichier de configuration des jours feries
  		 if (file_exists($this-&gt;_confi
g)) {
	       $this-&gt;configFile = parse_ini_file($this-&gt;_config,true);
	
       $this-&gt;displayDate = $this-&gt;configFile['displayDate']; 
	       //
 Fixe la timezone
	       $this-&gt;timezoneTmp = $this-&gt;configFile['fuseauH
oraire'];
	       if (isset($this-&gt;timezoneTmp[timezone])){
	       	date_d
efault_timezone_set($this-&gt;timezoneTmp[timezone]);
	       	//echo $this-&gt
;timezoneTmp[timezone]. '&lt;br /&gt;';
	       	}
	       	
	     }else{
	 
    	echo &quot;Il n'existe pas de fichier de configuration des dates fries&lt
;br/&gt;&quot;;
	     	echo &quot;Ce fichier doit se nommer 'joursFeries.ini' a
vec la mme synthaxe que le fichier php.ini&lt;br/&gt;&quot;;
	     	echo &quot
;Vous pouvez renommer le fichier 'joursFeries.ini.sample'&lt;br/&gt;&quot;;
	  
   	exit();
	     } 
    	// ==&gt; Fin de chargement du fichier des jours fer
ies
     
     	// Controle les arguments d'instanciation
		$i = func_num_arg
s();        
		switch ($i) {
		    case 0:
		        $this-&gt;_dateDeb = '01
-01-'.date('Y');
       			$this-&gt;_dateFin = '31-12-'.date('Y');
		        
break;
		    case 2:
		        if (strtotime ($date_fin) - strtotime ($date_de
b) &lt; 0) {
		          $this-&gt;_dateDeb = $date_fin;
		          $this-&gt
;_dateFin = $date_deb;
		        }else{
			      $this-&gt;_dateDeb = $date_de
b;
       			  $this-&gt;_dateFin = $date_fin;
		        }
		        break;

		    default:
		       echo 'Les arguments d\'instanciations sont incorrects&l
t;br/&gt;';
		       echo 'Sans argument le calendrier s\'tendra du 1er janvie
r au 31 dcembre de l\'anne en cours&lt;br/&gt;';
		       echo '&lt;br/&gt;';

		       echo 'usage: $ma_variable = new Calendrier()&lt;br/&gt;';
	         
  echo 'usage: $ma_variable = new Calendrier(\'date_deb\',\'date_fin\');';
	   
        exit();
		}
		// ==&gt; Fin de controle les arguments d'instanciation


		
		// ==&gt; initialisation des variables		
		$this-&gt;_lesJours = $this-&
gt;jours();
		$this-&gt;_lesWeekends = $this-&gt;weekends();
		$this-&gt;_lesA
nnees = $this-&gt;annees();
		$this-&gt;_lesFeriesFixes = $this-&gt;feriesFixes
();
		$this-&gt;_lesFeriesVariables = $this-&gt;feriesVariables();
		$this-&gt
;_tousLesFeries = $this-&gt;tousLesFeries();
		$this-&gt;_toutLeCalendrier = $t
his-&gt;toutLeCalendrier();

      } 
     
/**

<ul><li> Calcule tous les
 jours de la periode demandees</li></ul>
*

<ul><li> @param void
</li><li> @
return array
</li><li>/      </li></ul>
	private function jours(){
		 $date1=
 strtotime($this-&gt;_dateDeb);
	     $date2= strtotime($this-&gt;_dateFin);	  
  
	     $nbjour=($date2-$date1)/60/60/24;
	    
	     for($i=1;$i&lt;=$nbjou
r+1;$i++){
	     	if($this-&gt;displayDate[unixTime]=='0'){
	     		$numDay=jd
dayofweek(unixtojd($date1));
	     		$jours[date('d-m-Y',$date1)]=$this-&gt;lab
elJour($numDay);
	     	}else{
	     		$numDay=jddayofweek(unixtojd($date1));


				$jours[$date1]=$this-&gt;labelJour($numDay);
	     	}
				$date1= strtoti
me('+1 day', $date1);
	     }	     
	     return $jours;
	}

/**

<ul><li
> Calcule tous les weekends de la periode demandee</li></ul>
*

<ul><li> @par
am void
</li><li> @return array
</li><li>/</li></ul>
	private function weeken
ds(){
		$lesJours = $this-&gt;_lesJours;
	
		foreach ($lesJours as $key=&gt;$
value) {
			if($this-&gt;displayDate[unixTime]=='0'){
				if(jddayofweek(unixt
ojd(strtotime($key)))==0) {$weekend[$key]=$this-&gt;labelJour(jddayofweek(unixto
jd(strtotime($key))));}
				if(jddayofweek(unixtojd(strtotime($key)))==6) {$wee
kend[$key]=$this-&gt;labelJour(jddayofweek(unixtojd(strtotime($key))));}
			}el
se{
				if(jddayofweek(unixtojd($key))==0) {$weekend[$key]=$this-&gt;labelJour(
jddayofweek(unixtojd($key)));}
				if(jddayofweek(unixtojd($key))==6) {$weekend
[$key]=$this-&gt;labelJour(jddayofweek(unixtojd($key)));}
			}
		}
		unset($k
ey);
		unset($value);
		
		return $weekend;
	}

/**

<ul><li> Recupere l
es annees de la periode demandee</li></ul>
*

<ul><li> @param void
</li><li>
 @return array
</li><li>/</li></ul>
	private function annees(){
		$lesJours =
 $this-&gt;_lesJours;
		
		$i=0;
		foreach ($lesJours as $key=&gt;$value) {

			if($this-&gt;displayDate[unixTime]=='0'){
		    	$anneeTmp = date('Y',strtot
ime($key));
			}else{
				$anneeTmp = date('Y',$key);
			}
		    if (!in_arr
ay($anneeTmp, $annee)) {
			    $annee[$i]=$anneeTmp;
			    $i++;
			}
		}


		unset($key);
		unset($value);
		
		return $annee;
	}
	

/**

<ul><li
> Recupere les jours feriees fixes de la periode demandee</li></ul>
*

<ul><l
i> @param void
</li><li> @return array
</li><li>/</li></ul>
	private function
 feriesFixes(){
		$lesJours = $this-&gt;_lesJours;
		$annee = $this-&gt;_lesAn
nees;
		
		$feriesFixes=array();
		$joursFeriesFixes=$this-&gt;configFile['jo
ursFeriesFixes'];	
		$feriesFixes=array();
		foreach ($annee as $value) {
			
foreach ($joursFeriesFixes as $labelJour =&gt; $dateJour) {
				if($this-&gt;di
splayDate[unixTime]=='0'){
					$formatDate=$dateJour.'-'.$value;
				}else{

					$formatDate=strtotime($dateJour.'-'.$value);
				}
				if (in_array($form
atDate, array_keys($lesJours))) {
					if($this-&gt;displayDate[unixTime]=='0')
{
						$feriesFixes[$dateJour.'-'.$value]= $labelJour;
					}else{
						$fe
riesFixes[strtotime($dateJour.&quot;-&quot;.$value)]= $labelJour;
					}
				}

			}
			unset($labelJour);
			unset($dateJour);
		}
		unset($value);
		re
turn $feriesFixes;
	}

/**

<ul><li> Calcule le jour de Paques</li></ul>
*


<ul><li> @param annee
</li><li> @return date formatee &quot;d-m-Y&quot;
</
li><li>/</li></ul>
	private function paques($annee){
		$paques =  date(&quot;d
-m-Y&quot;, easter_date($annee));
		$lundipaques = date(&quot;d-m-Y&quot;,strto
time('+1 day',  easter_date($annee)));
		return array($paques,$lundipaques);
	
}
	

/**

<ul><li> Calcule le jour de l'ascension
</li><li> Jour de paques
 + 39 jours</li></ul>
*

<ul><li> @param annee
</li><li> @return date format
ee &quot;d-m-Y&quot;
</li><li>/</li></ul>
	private function ascension($annee){

		$ascension = date(&quot;d-m-Y&quot;,easter_date($annee)+(60*60*24*39));
		r
eturn $ascension;
	}

/**

<ul><li> Calcule le jour du lundi de Pentecote

</li><li> Jour de paques + 49 jours</li></ul>
*

<ul><li> @param annee
</li>
<li> @return date formatee &quot;d-m-Y&quot;
</li><li>/	</li></ul>
	private fu
nction pentecote($annee){
		$pentecote = date(&quot;d-m-Y&quot;,easter_date($an
nee)+(60*60*24*49));
		$lundipentecote = date(&quot;d-m-Y&quot;,strtotime('+1 d
ay', easter_date($annee)+(60*60*24*49)));
		return array($pentecote,$lundipente
cote);
	}

/**

<ul><li> Recupere les jours feriees variables de la periode
 demandee</li></ul>
*

<ul><li> @param void
</li><li> @return array
</li><l
i>/</li></ul>
	private function feriesVariables(){
		$lesJours = $this-&gt;_le
sJours;
		$annee = $this-&gt;_lesAnnees;
		
		$feriesVariables=array();	
		$
joursFeriesVariables=$this-&gt;configFile['joursFeriesVariables'];
		
		foreac
h ($annee as $value) {
			if($this-&gt;displayDate[unixTime]=='0'){	
				if($j
oursFeriesVariables['lundi de Paques']=='1'){
				$tmp = $this-&gt;paques($valu
e);
				$feriesVariablesTmp[$tmp[0]]='Pques';
				$feriesVariablesTmp[$tmp[1]
]='lundi de Pques';
				}
				if($joursFeriesVariables[Ascension]=='1'){
			
	$feriesVariablesTmp[$this-&gt;ascension($value)]='Ascension';
				}
				if($j
oursFeriesVariables['lundi de Pentecote']=='1'){
				$tmp = $this-&gt;pentecote
($value);
				$feriesVariablesTmp[$tmp[0]]='Pentecote';
				$feriesVariablesTm
p[$tmp[1]]='lundi de Pentecote';	
				}
				
			}else{
			
				if($joursFer
iesVariables['lundi de Paques']=='1'){
				$tmp = $this-&gt;paques($value);
		
		$feriesVariablesTmp[$tmp[0]]='Pques';
				$feriesVariablesTmp[$tmp[1]]='lund
i de Pques';
				}
				if($joursFeriesVariables[Ascension]=='1'){
				$ferie
sVariablesTmp[strtotime($this-&gt;ascension($value))]='Ascension';
				}
				i
f($joursFeriesVariables['lundi de Pentecote']=='1'){
				$tmp = $this-&gt;pente
cote($value);
				$feriesVariablesTmp[$tmp[0]]='Pentecote';
				$feriesVariabl
esTmp[$tmp[1]]='lundi de Pentecote';	
				}
			}		 
		}
		unset($value);
		

		$feriesVariables=array();
		foreach ($feriesVariablesTmp as $key =&gt; $lab
el) {
			if (in_array($key, array_keys($lesJours))) {
				$feriesVariables[$ke
y]=$label;
			}
		}	
		unset($key);
		unset($label);
		
		return $feriesVa
riables;
	}

/**

<ul><li> Recupere tous les jours feriees fixes et variabl
es de la periode demandee</li></ul>
*

<ul><li> @param void
</li><li> @retur
n array
</li><li>/</li></ul>
	private function tousLesFeries(){
		
		$feries
=array();
		
		// dates et labels
		$joursFeriesVariables=$this-&gt;_lesFerie
sVariables;
		$joursFeriesFixes=$this-&gt;_lesFeriesFixes;
		
		// Que les da
tes
		$listeDatesFixes=array_keys($joursFeriesFixes);
		$listeDatesVariables=a
rray_keys($joursFeriesVariables);	
			
					
		 if($this-&gt;displayDate[unix
Time]=='0'){
			foreach ($listeDatesFixes as $key=&gt;$value) {
				$listeDate
sFixes[$key]=strtotime($value);
			}
			unset($key);
			unset($value);
					
	
			foreach ($listeDatesVariables as $key=&gt;$value) {
				$listeDatesVariab
les[$key]=strtotime($value);
			}
			unset($key);
			unset($value);
			
			
if(count($listeDatesFixes)&gt;0 AND count($listeDatesVariables)&gt;0){
				$tou
tesDates=array_merge($listeDatesFixes,$listeDatesVariables);
				$tousLabel=arr
ay_merge($joursFeriesFixes,$joursFeriesVariables);
				$feries=array_combine($t
outesDates,$tousLabel);
				
			}else{
				if(count($listeDatesFixes)==0){
	
				$toutesDates=$listeDatesVariables;
					$tousLabel=$joursFeriesVariables;

					$feries=array_combine($toutesDates,$tousLabel);
					
				}else{
					$t
outesDates=$listeDatesFixes;
					$tousLabel=$joursFeriesFixes;
					$feries=a
rray_combine($toutesDates,$tousLabel);
				}
			}
			// On trie sur les dates
 (keys) au format timestamp unix
			// puis on les convertit en date formatee &
quot;d-m-Y&quot;	
			ksort($feries);			
			$tmp1=array_keys($feries);      
	
       	$tmp2=array_values($feries);
	       	foreach ($tmp1 as $key=&gt;$value
) {
					$tmp3[$key]=date(&quot;d-m-Y&quot;,$value);
				}
			unset($key);
	
		unset($value); 
	       	$feries=array_combine($tmp3,$tmp2);
	       	      
 
		}else{

			if(count($listeDatesFixes)&gt;0 AND count($listeDatesVariables
)&gt;0){
				$toutesDates=array_merge($listeDatesFixes,$listeDatesVariables);

				$tousLabel=array_merge($joursFeriesFixes,$joursFeriesVariables);
				$ferie
s=array_combine($toutesDates,$tousLabel);			
			}else{
				if(count($listeDate
sFixes)==0){
					$feries=$joursFeriesVariables;			
				}else{
					$feries=$
joursFeriesFixes;
				}
			}
			
			ksort($feries);			
		}
		return $ferie
s;
	}
	

/**

<ul><li> Toutes les dates et labels des dates dans un tablea
u de la periode demandee</li></ul>
*

<ul><li> @param void
</li><li> @return
 array
</li><li>/</li></ul>
	private function toutLeCalendrier(){
		$lesJours
=$this-&gt;_lesJours;
		$lesWeekends=$this-&gt;_lesWeekends;
		$lesAnnees=$thi
s-&gt;_lesAnnees;
		$tousLesFeries=$this-&gt;_tousLesFeries;
		$datesFeries=ar
ray_keys($tousLesFeries);
		
		foreach($lesAnnees as $annee){
			foreach ($le
sJours as $keyJours=&gt;$valueJours) {
		    	if (date(&quot;Y&quot;,strtotime(
$keyJours)) == $annee) {	
		    		$anneeTmp = date(&quot;Y&quot;,strtotime($key
Jours));		    		
					$moisTmp = date(&quot;m&quot;,strtotime($keyJours)); 			


					$joursTmp = date(&quot;j&quot;,strtotime($keyJours));
					$joursTmp2 = d
ate(&quot;d-m-Y&quot;,strtotime($keyJours)); 			
					if (!in_array($joursTmp2,
 $datesFeries)) {				    
					    $explodeCalendar[$annee][$moisTmp][$joursTmp
]=$valueJours;
					}
					else{
						$explodeCalendar[$annee][$moisTmp][$jo
ursTmp][$valueJours]=$tousLesFeries[$joursTmp2];
					}			
		    	}
			}
		}

		
		return $explodeCalendar;	
	}
	
	
		
/**

<ul><li> Acces aux attri
buts prives du calendrier</li></ul>
*

<ul><li> @param nom de l'attribut
</l
i><li> @return array
</li><li>/ </li></ul>
	public function __get($nameAttribu
t) {
	    $temp='_'.$nameAttribut;
	    return $this-&gt;$temp;
	  }

/**


<ul><li> Converti le label des jours</li></ul>
*

<ul><li> @param int valeu
r numerique du jour entre 0 et 6
</li><li> @return string chaine de caracteres 
du jour
</li><li>/ </li></ul>
	public function labelJour($numJour){
		$test=p
reg_match(&quot;/^0/&quot;,$numJours);		
		if($test){$numJour=preg_replace('/^0
/',&quot;&quot;, $numJour);}
		
		$strJours = $this-&gt;configFile['labelsJour
s'];	
		return $strJours[$numJour];			
	}
	
		  
/**

<ul><li> Conversion
 des mois numriques en chaine de caracteres</li></ul>
*

<ul><li> @param int
 valeur numerique du mois entre 1 et 12
</li><li> @return string chaine de cara
cteres du mois
</li><li>/ 	  </li></ul>
	
	public function labelMois($numMois
) {
		$test=preg_match(&quot;/^0/&quot;,$numMois);		
		if($test){$numMois=preg
_replace('/^0/',&quot;&quot;, $numMois);}
		
		$strMois = $this-&gt;configFile
['labelsMois'];	
		return $strMois[$numMois];	
	  }
	  
}
?&gt;

==&gt; C
onfig

; Ceci est un fichier de configuration
; Les commentaires commencent p
ar ';', comme dans php.ini

[fuseauHoraire]
; Fixe le fuseau horaire  utilis
er
; par defaut c'est celui du php.ini qui sera utilis
; liste des fuseaux su
pports : <a href='http://www.php.net/manual/fr/timezones.php' target='_blank'>h
ttp://www.php.net/manual/fr/timezones.php</a>
timezone=Europe/Paris

[display
Date]
; Permet de choisir le choix du format de date utilis
; ATTENTION ne pa
s changer le format une fois que le calendrier est utilis
; 1 = Fomat Unix tim
estamp.
; 0 = Format lisible par l'humain (j-m-Y)
; 1 = par dfaut
unixTime=0


[labelsJours]
; Convertie les jours numriques en quivalent en chaine de c
aractre
0=Di
1=Lu
2=Ma
3=Me
4=Je
5=Ve
6=Sa

[labelsMois]
; Convertie 
les mois numriques en quivalent en chaine de caractre
1=Janvier
2=Fevrier

3=Mars
4=Avril
5=Mai
6=Juin
7=Juillet
8=Aout
9=Septembre
10=Octobre
11=N
ovembre
12=Decembre

[joursFeriesFixes]
;  ==== ATTENTION =====
; indiquez 
le jour et le mois du jour ferie sur 2 digits (jj-mm)

Jour de l'an=01-01
Fet
e du travail=01-05
8 mai 1945=08-05
Fete Nationale=14-07
Assomption=15-08
La
 Toussaint=01-11
Armistice=11-11
Noel=25-12

[joursFeriesVariables]
; En ca
s de supression du ou des jours feries variable
; 0 = frie supprime
; 1 = fr
i
; 0 = par defaut

lundi de Paques=1
Ascension=1
lundi de Pentecote=1
</
pre>
<br /><a name='conclusion'></a><h2> Conclusion : </h2>

<br />Le niveau d
u script? je ne sais pas &agrave; vous de me dire.
