Class calendrier et jours fériés

Soyez le premier à donner votre avis sur cette source.

Vue 5 395 fois - Téléchargée 507 fois

Description

Je me teste à la POO en php voici donc ma première réalisation 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.

Il ne permet pas de générer graphiquement un calendrier mais de générer des dates pour les exploiter après.
Les dates sont configurables par fichier le conf.ini
Vous pouvez générer la plage de calendrier que vous voulez.
un fichier mainTest.php est joint pour tester et une démo de ce qui peut etre généré.

NB: Il faudrait revoir tout le code pour passer au Datetime, donc pour une peut etre future version.

Source / Exemple :


==> Clas

<?php
/**

  • Generation des dates pour realiser un calendrier
*
  • Cette class genere toutes les dates necessaire pour realiser un calendrier
  • les dates sont retournees sous forme array()
  • les dates generees sont :
  • - tous les jours de la periode du calendrier passee en parametre
  • - tous les weekends de la periode du calendrier passee en parametre
  • - tous les jours feries fixes francais de la periode du calendrier passee en parametre
  • - tous les jours feries variables (paques, pentecote,ascension) de la periode du calendrier passee en parametre
  • - le cumul par ordre chronologique croissant des jours feries
* class Calendrier{ // Les attributs prives retournes par __get() private $_lesJours; private $_lesWeekends; private $_lesAnnees; private $_lesFeriesFixes; private $_lesFeriesVariables; private $_tousLesFeries; private $_toutLeCalendrier; // Les attributs prives non retournes private $_dateDeb; private $_dateFin; private $_config = "conf.ini"; private $configFile = array(); public function __construct($date_deb,$date_fin){ // Controle que le module Calendar est chargé if (!extension_loaded("calendar")) {echo "Cette class utilise les fonctions de Calendar.";exit();} // Chargement du fichier de configuration des jours feries if (file_exists($this->_config)) { $this->configFile = parse_ini_file($this->_config,true); $this->displayDate = $this->configFile['displayDate']; // Fixe la timezone $this->timezoneTmp = $this->configFile['fuseauHoraire']; if (isset($this->timezoneTmp[timezone])){ date_default_timezone_set($this->timezoneTmp[timezone]); //echo $this->timezoneTmp[timezone]. '<br />'; } }else{ echo "Il n'existe pas de fichier de configuration des dates fériées<br/>"; echo "Ce fichier doit se nommer 'joursFeries.ini' avec la même synthaxe que le fichier php.ini<br/>"; echo "Vous pouvez renommer le fichier 'joursFeries.ini.sample'<br/>"; exit(); } // ==> Fin de chargement du fichier des jours feries // Controle les arguments d'instanciation $i = func_num_args(); switch ($i) { case 0: $this->_dateDeb = '01-01-'.date('Y'); $this->_dateFin = '31-12-'.date('Y'); break; case 2: if (strtotime ($date_fin) - strtotime ($date_deb) < 0) { $this->_dateDeb = $date_fin; $this->_dateFin = $date_deb; }else{ $this->_dateDeb = $date_deb; $this->_dateFin = $date_fin; } break; default: echo 'Les arguments d\'instanciations sont incorrects<br/>'; echo 'Sans argument le calendrier s\'étendra du 1er janvier au 31 décembre de l\'année en cours<br/>'; echo '<br/>'; echo 'usage: $ma_variable = new Calendrier()<br/>'; echo 'usage: $ma_variable = new Calendrier(\'date_deb\',\'date_fin\');'; exit(); } // ==> Fin de controle les arguments d'instanciation // ==> initialisation des variables $this->_lesJours = $this->jours(); $this->_lesWeekends = $this->weekends(); $this->_lesAnnees = $this->annees(); $this->_lesFeriesFixes = $this->feriesFixes(); $this->_lesFeriesVariables = $this->feriesVariables(); $this->_tousLesFeries = $this->tousLesFeries(); $this->_toutLeCalendrier = $this->toutLeCalendrier(); } /**
  • Calcule tous les jours de la periode demandees
*
  • @param void
  • @return array
  • /
private function jours(){ $date1= strtotime($this->_dateDeb); $date2= strtotime($this->_dateFin); $nbjour=($date2-$date1)/60/60/24; for($i=1;$i<=$nbjour+1;$i++){ if($this->displayDate[unixTime]=='0'){ $numDay=jddayofweek(unixtojd($date1)); $jours[date('d-m-Y',$date1)]=$this->labelJour($numDay); }else{ $numDay=jddayofweek(unixtojd($date1)); $jours[$date1]=$this->labelJour($numDay); } $date1= strtotime('+1 day', $date1); } return $jours; } /**
  • Calcule tous les weekends de la periode demandee
*
  • @param void
  • @return array
  • /
private function weekends(){ $lesJours = $this->_lesJours; foreach ($lesJours as $key=>$value) { if($this->displayDate[unixTime]=='0'){ if(jddayofweek(unixtojd(strtotime($key)))==0) {$weekend[$key]=$this->labelJour(jddayofweek(unixtojd(strtotime($key))));} if(jddayofweek(unixtojd(strtotime($key)))==6) {$weekend[$key]=$this->labelJour(jddayofweek(unixtojd(strtotime($key))));} }else{ if(jddayofweek(unixtojd($key))==0) {$weekend[$key]=$this->labelJour(jddayofweek(unixtojd($key)));} if(jddayofweek(unixtojd($key))==6) {$weekend[$key]=$this->labelJour(jddayofweek(unixtojd($key)));} } } unset($key); unset($value); return $weekend; } /**
  • Recupere les annees de la periode demandee
*
  • @param void
  • @return array
  • /
private function annees(){ $lesJours = $this->_lesJours; $i=0; foreach ($lesJours as $key=>$value) { if($this->displayDate[unixTime]=='0'){ $anneeTmp = date('Y',strtotime($key)); }else{ $anneeTmp = date('Y',$key); } if (!in_array($anneeTmp, $annee)) { $annee[$i]=$anneeTmp; $i++; } } unset($key); unset($value); return $annee; } /**
  • Recupere les jours feriees fixes de la periode demandee
*
  • @param void
  • @return array
  • /
private function feriesFixes(){ $lesJours = $this->_lesJours; $annee = $this->_lesAnnees; $feriesFixes=array(); $joursFeriesFixes=$this->configFile['joursFeriesFixes']; $feriesFixes=array(); foreach ($annee as $value) { foreach ($joursFeriesFixes as $labelJour => $dateJour) { if($this->displayDate[unixTime]=='0'){ $formatDate=$dateJour.'-'.$value; }else{ $formatDate=strtotime($dateJour.'-'.$value); } if (in_array($formatDate, array_keys($lesJours))) { if($this->displayDate[unixTime]=='0'){ $feriesFixes[$dateJour.'-'.$value]= $labelJour; }else{ $feriesFixes[strtotime($dateJour."-".$value)]= $labelJour; } } } unset($labelJour); unset($dateJour); } unset($value); return $feriesFixes; } /**
  • Calcule le jour de Paques
*
  • @param annee
  • @return date formatee "d-m-Y"
  • /
private function paques($annee){ $paques = date("d-m-Y", easter_date($annee)); $lundipaques = date("d-m-Y",strtotime('+1 day', easter_date($annee))); return array($paques,$lundipaques); } /**
  • Calcule le jour de l'ascension
  • Jour de paques + 39 jours
*
  • @param annee
  • @return date formatee "d-m-Y"
  • /
private function ascension($annee){ $ascension = date("d-m-Y",easter_date($annee)+(60*60*24*39)); return $ascension; } /**
  • Calcule le jour du lundi de Pentecote
  • Jour de paques + 49 jours
*
  • @param annee
  • @return date formatee "d-m-Y"
  • /
private function pentecote($annee){ $pentecote = date("d-m-Y",easter_date($annee)+(60*60*24*49)); $lundipentecote = date("d-m-Y",strtotime('+1 day', easter_date($annee)+(60*60*24*49))); return array($pentecote,$lundipentecote); } /**
  • Recupere les jours feriees variables de la periode demandee
*
  • @param void
  • @return array
  • /
private function feriesVariables(){ $lesJours = $this->_lesJours; $annee = $this->_lesAnnees; $feriesVariables=array(); $joursFeriesVariables=$this->configFile['joursFeriesVariables']; foreach ($annee as $value) { if($this->displayDate[unixTime]=='0'){ if($joursFeriesVariables['lundi de Paques']=='1'){ $tmp = $this->paques($value); $feriesVariablesTmp[$tmp[0]]='Pâques'; $feriesVariablesTmp[$tmp[1]]='lundi de Pâques'; } if($joursFeriesVariables[Ascension]=='1'){ $feriesVariablesTmp[$this->ascension($value)]='Ascension'; } if($joursFeriesVariables['lundi de Pentecote']=='1'){ $tmp = $this->pentecote($value); $feriesVariablesTmp[$tmp[0]]='Pentecote'; $feriesVariablesTmp[$tmp[1]]='lundi de Pentecote'; } }else{ if($joursFeriesVariables['lundi de Paques']=='1'){ $tmp = $this->paques($value); $feriesVariablesTmp[$tmp[0]]='Pâques'; $feriesVariablesTmp[$tmp[1]]='lundi de Pâques'; } if($joursFeriesVariables[Ascension]=='1'){ $feriesVariablesTmp[strtotime($this->ascension($value))]='Ascension'; } if($joursFeriesVariables['lundi de Pentecote']=='1'){ $tmp = $this->pentecote($value); $feriesVariablesTmp[$tmp[0]]='Pentecote'; $feriesVariablesTmp[$tmp[1]]='lundi de Pentecote'; } } } unset($value); $feriesVariables=array(); foreach ($feriesVariablesTmp as $key => $label) { if (in_array($key, array_keys($lesJours))) { $feriesVariables[$key]=$label; } } unset($key); unset($label); return $feriesVariables; } /**
  • Recupere tous les jours feriees fixes et variables de la periode demandee
*
  • @param void
  • @return array
  • /
private function tousLesFeries(){ $feries=array(); // dates et labels $joursFeriesVariables=$this->_lesFeriesVariables; $joursFeriesFixes=$this->_lesFeriesFixes; // Que les dates $listeDatesFixes=array_keys($joursFeriesFixes); $listeDatesVariables=array_keys($joursFeriesVariables); if($this->displayDate[unixTime]=='0'){ foreach ($listeDatesFixes as $key=>$value) { $listeDatesFixes[$key]=strtotime($value); } unset($key); unset($value); foreach ($listeDatesVariables as $key=>$value) { $listeDatesVariables[$key]=strtotime($value); } unset($key); unset($value); if(count($listeDatesFixes)>0 AND count($listeDatesVariables)>0){ $toutesDates=array_merge($listeDatesFixes,$listeDatesVariables); $tousLabel=array_merge($joursFeriesFixes,$joursFeriesVariables); $feries=array_combine($toutesDates,$tousLabel); }else{ if(count($listeDatesFixes)==0){ $toutesDates=$listeDatesVariables; $tousLabel=$joursFeriesVariables; $feries=array_combine($toutesDates,$tousLabel); }else{ $toutesDates=$listeDatesFixes; $tousLabel=$joursFeriesFixes; $feries=array_combine($toutesDates,$tousLabel); } } // On trie sur les dates (keys) au format timestamp unix // puis on les convertit en date formatee "d-m-Y" ksort($feries); $tmp1=array_keys($feries); $tmp2=array_values($feries); foreach ($tmp1 as $key=>$value) { $tmp3[$key]=date("d-m-Y",$value); } unset($key); unset($value); $feries=array_combine($tmp3,$tmp2); }else{ if(count($listeDatesFixes)>0 AND count($listeDatesVariables)>0){ $toutesDates=array_merge($listeDatesFixes,$listeDatesVariables); $tousLabel=array_merge($joursFeriesFixes,$joursFeriesVariables); $feries=array_combine($toutesDates,$tousLabel); }else{ if(count($listeDatesFixes)==0){ $feries=$joursFeriesVariables; }else{ $feries=$joursFeriesFixes; } } ksort($feries); } return $feries; } /**
  • Toutes les dates et labels des dates dans un tableau de la periode demandee
*
  • @param void
  • @return array
  • /
private function toutLeCalendrier(){ $lesJours=$this->_lesJours; $lesWeekends=$this->_lesWeekends; $lesAnnees=$this->_lesAnnees; $tousLesFeries=$this->_tousLesFeries; $datesFeries=array_keys($tousLesFeries); foreach($lesAnnees as $annee){ foreach ($lesJours as $keyJours=>$valueJours) { if (date("Y",strtotime($keyJours)) == $annee) { $anneeTmp = date("Y",strtotime($keyJours)); $moisTmp = date("m",strtotime($keyJours)); $joursTmp = date("j",strtotime($keyJours)); $joursTmp2 = date("d-m-Y",strtotime($keyJours)); if (!in_array($joursTmp2, $datesFeries)) { $explodeCalendar[$annee][$moisTmp][$joursTmp]=$valueJours; } else{ $explodeCalendar[$annee][$moisTmp][$joursTmp][$valueJours]=$tousLesFeries[$joursTmp2]; } } } } return $explodeCalendar; } /**
  • Acces aux attributs prives du calendrier
*
  • @param nom de l'attribut
  • @return array
  • /
public function __get($nameAttribut) { $temp='_'.$nameAttribut; return $this->$temp; } /**
  • Converti le label des jours
*
  • @param int valeur numerique du jour entre 0 et 6
  • @return string chaine de caracteres du jour
  • /
public function labelJour($numJour){ $test=preg_match("/^0/",$numJours); if($test){$numJour=preg_replace('/^0/',"", $numJour);} $strJours = $this->configFile['labelsJours']; return $strJours[$numJour]; } /**
  • Conversion des mois numériques en chaine de caracteres
*
  • @param int valeur numerique du mois entre 1 et 12
  • @return string chaine de caracteres du mois
  • /
public function labelMois($numMois) { $test=preg_match("/^0/",$numMois); if($test){$numMois=preg_replace('/^0/',"", $numMois);} $strMois = $this->configFile['labelsMois']; return $strMois[$numMois]; } } ?> ==> Config ; Ceci est un fichier de configuration ; Les commentaires commencent par ';', comme dans php.ini [fuseauHoraire] ; Fixe le fuseau horaire à utiliser ; par defaut c'est celui du php.ini qui sera utilisé ; liste des fuseaux supportés : http://www.php.net/manual/fr/timezones.php timezone=Europe/Paris [displayDate] ; Permet de choisir le choix du format de date utilisé ; ATTENTION ne pas changer le format une fois que le calendrier est utilisé ; 1 = Fomat Unix timestamp. ; 0 = Format lisible par l'humain (j-m-Y) ; 1 = par défaut unixTime=0 [labelsJours] ; Convertie les jours numériques en équivalent en chaine de caractère 0=Di 1=Lu 2=Ma 3=Me 4=Je 5=Ve 6=Sa [labelsMois] ; Convertie les mois numériques en équivalent en chaine de caractère 1=Janvier 2=Fevrier 3=Mars 4=Avril 5=Mai 6=Juin 7=Juillet 8=Aout 9=Septembre 10=Octobre 11=Novembre 12=Decembre [joursFeriesFixes] ; ==== ATTENTION ===== ; indiquez le jour et le mois du jour ferie sur 2 digits (jj-mm) Jour de l'an=01-01 Fete 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 cas de supression du ou des jours feries variable ; 0 = férie supprime ; 1 = férié ; 0 = par defaut lundi de Paques=1 Ascension=1 lundi de Pentecote=1

Conclusion :


Le niveau du script? je ne sais pas à vous de me dire.

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

neigedhiver
Messages postés
2483
Date d'inscription
jeudi 30 novembre 2006
Statut
Membre
Dernière intervention
14 janvier 2011
13 -
Salut,

Ok pour l'exercice... Je vais donc m'adonner à celui que j'aime sur ce site : critiquer ^^

Dans le constructeur, tu utilises echo si le fichier de configuration n'est pas trouvé. C'est une mauvaise chose, parce que tu ne laisses pas à l'utilisateur la possibilité de gérer lui-même et comme il l'entend les erreurs qui sont produites. Le mieux est de lever une exception. Cela aura pour effet d'interrompre l'exécution du code de la classe, donc son instanciation (ce que tu fais avec exit). L'exception sera attrapable avec un bloc try...catch et pourra être gérée comme l'utilisateur le souhaite (par exemple, enregistrer l'erreur dans un fichier de log, envoyer un mail pour prévenir l'admin, afficher une erreur qui n'indique pas d'informations sur les fichiers, etc). QUant au message d'erreur associé à l'exception, l'utilisateur sera libre d'en faire ce qu'il veut.

Au lieu de compter les arguments, tu devrais utiliser des valeurs par défaut (NULL par exemple) et tester ces valeurs. C'est un peu moins lourd et quand même plus esthétique.

On vient d'avoir un grand débat sur l'utilisation de strtotime() sur le forum. Depuis PHP5.1, le fait de ne pas préciser le fuseau horaire provoque une erreur (qu'on peut ne pas afficher avec error_reporting(0), mais c'est crade). Il faut utiliser date_default_timezone_set() pour définir le fuseau horaire que PHP utilisera (sinon, il prendra le fuseau horaire par défaut dans le php.ini, mais déclenchera quand même l'erreur).

De même, si les arguments sont incorrects, plutôt que d'écrire du texte, il est préférable de lever une exception. Il en existe même une faite exprès pour ce cas précis : BadMethodCallException. Si les arguments ne sont pas du type attendu (mauvais format de date, etc), il existe InvalidArgumentException. Ces exceptions spécialisées permettent au développeur de contrôler le plus finement possible les erreurs qui surviennent lors de l'exécution de son code.

Tu utilises, entre autres, la fonction easter_date() qui nécessite que l'extension calendar soit installée. C'est le cas sur Windows par défaut, mais pas sur Linux/Unix... Tu devrais au début de ton script vérifier que toutes les fonctions dont tu as besoin sont disponibles (avec function_exists('easter_date') par exemple, ou, plus rigoureux : extension_loaded('calendar'))

J'ai pas regardé plus en détails, ni testé. Au niveau du code, c'est propre, lisible, commenté.
Quitte à faire de l'objet, je pense qu'il peut être intéressant d'utiliser l'objet DateTime.

Voilà voilà.
beemoon
Messages postés
1
Date d'inscription
mercredi 22 juin 2005
Statut
Membre
Dernière intervention
8 octobre 2010
-
Merci pour toutes ces remarques très instructives. Je ne me suis pas encore aventuré sur les exceptions... chaque chose en son temps.

Le coup du easter je ne savais pas car sur MAMP sous OSX c'est présent donc je ne pensais pas que la fonction pouvait ne pas etre disponible.

Je regarde pour le reste (strtotime, DateTime...)
neigedhiver
Messages postés
2483
Date d'inscription
jeudi 30 novembre 2006
Statut
Membre
Dernière intervention
14 janvier 2011
13 -
Concernant les exceptions, rien de terrible. Au lieu d'écrire du texte avec echo, il suffit de faire ça :

throw new Exception("Message d'erreur");

C'est à l'utilisateur de gérer l'exception que tu as levée. Concrètement, pour ce cas précis, tu n'as pas "besoin" d'en savoir plus => tu pourras prendre le temps plus tard de te pencher dessus plus sérieusement, c'est pas un soucis ;)

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.