Classe calendrier

Soyez le premier à donner votre avis sur cette source.

Vue 8 920 fois - Téléchargée 964 fois

Description

classe pour afficher un petit calendrier tout simple en PHP5. J'ai pas trouvé de classe pour afficher un calendrier en PHP5 sur ce site donc je me permets de proposer la mienne (qui est très light parce que je débute).

->Je complète et mets à jour cette source suivant les commentaires que l'on me laisse. Si vous avez des idées, des observations ou des suggestions n'hésitez pas. merci

Source / Exemple :


<?php
/*
Fichier : class_calendar.php
Auteur : kik's
Date de création : 25/02/09
Dernière modification : 01/06/11

-> Classe des calendriers

  • /
abstract class Abstractcalendar { /**
  • Mois du calendrier
*
  • @var int
  • /
protected $month = 0; /**
  • Année du calendrier
*
  • @var int
  • /
protected $year = 0; /**
  • Tableau des mois
*
  • @var array(string)
  • /
protected $ar_months = array(1=>'Janvier', 'Février', 'Mars', 'Avril', 'Mai', 'Juin', 'Juillet', 'Août', 'Septembre', 'Octobre', 'Novembre', 'Décembre'); /**
  • Tableau des jours
*
  • @var array(string)
  • /
protected $ar_days = array(1=>'Lu', 'Ma', 'Me', 'Je', 'Ve', 'Sa', 'Di'); /**
  • Tableau des jours fériés
*
  • @var array(string)
  • /
protected $ar_holidays = array('01/01', '01/05', '08/05', '14/07', '15/08', '11/11', '25/12'); /**
  • Tableau des jours de vacances
*
  • @var array(string)
  • /
protected $ar_vacations = array(); /**
  • Tableau des jours fériés
*
  • @var array(string)
  • /
protected $ar_edays = array(); /**
  • Chaine de sortie du calendrier contruite avec les méthodes build_
*
  • @var array(string)
  • /
protected $cout = array(); /**
  • @desc Constructeur
*
  • @return void
  • /
public function __construct($month, $year) { $this->set_month($month); $this->set_year($year); } /**
  • @desc Vérifie et établie la valeur de $this->month
*
  • @param int $month -> Mois du calendrier
  • @return void
  • /
public function set_month($month) { if($month<=12 && $month>=1) $this->month = $month; /*else echo 'Le format du mois est incorrect<br />';*/ } /**
  • @desc Vérifie et établie la valeur de $this->year
*
  • @param int $year -> Année du calendrier
  • @return void
  • /
public function set_year($year) { if($year<=2050 && $year>=1900) $this->year = $year; /*else echo 'Le format de l\'année est incorrect<br />';*/ } /**
  • @desc Retourne le mois en lettres
*
  • @return string
  • /
public function get_month() { return $this->ar_months[$this->month]; } /**
  • @desc Retourne le mois en lettres
*
  • @return string
  • /
protected function get_eday_url($day) { foreach($this->ar_edays as $date => $url) { if($date==$day) return $url; } } /**
  • @desc Détermine si le jour peut être affiché dans la cellule
*
  • @param int $day -> jour courant
  • @param int $cel -> numéro de la cellule
  • @return bool
  • /
protected function is_day($day, $cel) { $n_days = cal_days_in_month(CAL_GREGORIAN, $this->month, $this->year); $first_day = jddayofweek(cal_to_jd(CAL_GREGORIAN, $this->month, 1, $this->year), 0); $first_day = ($first_day==0) ? 7 : ($first_day); if($cel>=$first_day && $cel<$n_days+$first_day) return 1; else return 0; } /**
  • @desc Détermine si le jour est aujourd'hui
*
  • @param int $day -> jour courant
  • @return bool
  • /
protected function is_today($day) { if($day==date('j') && $this->month== date('n') && $this->year==date('Y')) return 1; else return 0; } /**
  • @desc Détermine si le jour est férié
*
  • @param int $day -> jour courant
  • @return bool
  • /
protected function is_holiday($day) { foreach($this->ar_holidays as $date) { $date = explode("/", $date); if($day==$date[0] && $this->month==$date[1]) return 1; } return 0; } /**
  • @desc Détermine si le jour est un jour de vacances
*
  • @param int $day -> jour courant
  • @return bool
  • /
protected function is_vacation($day) { foreach($this->ar_vacations as $date) { $date = explode("/", $date); if($day==$date[0] && $this->month==$date[1]) return 1; } return 0; } /**
  • @desc Détermine si le jour est lié
*
  • @param int $day -> jour courant
  • @return bool
  • /
protected function is_eday($day) { foreach($this->ar_edays as $date => $url) { $date = explode("/", $date); if($day==$date[0] && $this->month==$date[1]) return 1; } return 0; } /**
  • @desc Ajoute des jours au tableau des jours fériés
*
  • @param string $holiday -> jour férié à ajouter (format : 'dd/mm' ou 'dd/mm->dd/mm')
  • @return void
  • /
public function add_holiday($holiday) { if(preg_match('#^([0-2][0-9]|3[0-1])/(0[1-9]|1[0-2])->([0-2][0-9]|3[0-1])/(0[1-9]|1[0-2])$#', $holiday)) { $tmp_ar = explode('->', $holiday); $tmp_date[0] = explode('/', $tmp_ar[0]); $tmp_date[1] = explode('/', $tmp_ar[1]); for($a=$tmp_date[0][1];$a<=$tmp_date[1][1];$a++) { if($tmp_date[0][1]==$tmp_date[1][1]) { for($b=$tmp_date[0][0];$b<=$tmp_date[1][0];$b++) { $tmp_push = $b . '/' . $a; array_push($this->ar_holidays, $tmp_push); } } elseif($a<$tmp_date[1][1]) { for($b=$tmp_date[0][0];$b<=cal_days_in_month(CAL_GREGORIAN, $a, $this->year);$b++) { $tmp_push = $b . '/' . $a; array_push($this->ar_holidays, $tmp_push); } $tmp_date[0][0]=1; } else { for($b=$tmp_date[0][0];$b<=$tmp_date[1][0];$b++) { $tmp_push = $b . '/' . $a; array_push($this->ar_holidays, $tmp_push); } } } } elseif(preg_match('#^([0-2][0-9]|3[0-1])/(0[1-9]|1[0-2])$#', $holiday)) { array_push($this->ar_holidays, $holiday); } /*else echo 'Format de date incorrect<br />';*/ } /**
  • @desc Ajoute des jours au tableau des jours de vacances
*
  • @param string $vacation -> jour férié à ajouter (format : 'dd/mm' ou 'dd/mm->dd/mm')
  • @return void
  • /
public function add_vacation($vacation) { if(preg_match('#^([0-2][0-9]|3[0-1])/(0[1-9]|1[0-2])->([0-2][0-9]|3[0-1])/(0[1-9]|1[0-2])$#', $vacation)) { $tmp_ar = explode('->', $vacation); $tmp_date[0] = explode('/', $tmp_ar[0]); $tmp_date[1] = explode('/', $tmp_ar[1]); for($a=$tmp_date[0][1];$a<=$tmp_date[1][1];$a++) { if($tmp_date[0][1]==$tmp_date[1][1]) { for($b=$tmp_date[0][0];$b<=$tmp_date[1][0];$b++) { $tmp_push = $b . '/' . $a; array_push($this->ar_vacations, $tmp_push); } } elseif($a<$tmp_date[1][1]) { for($b=$tmp_date[0][0];$b<=cal_days_in_month(CAL_GREGORIAN, $a, $this->year);$b++) { $tmp_push = $b . '/' . $a; array_push($this->ar_vacations, $tmp_push); } $tmp_date[0][0]=1; } else { for($b=$tmp_date[0][0];$b<=$tmp_date[1][0];$b++) { $tmp_push = $b . '/' . $a; array_push($this->ar_vacations, $tmp_push); } } } } elseif(preg_match('#^([0-2][0-9]|3[0-1])/(0[1-9]|1[0-2])$#', $vacation)) { array_push($this->ar_vacations, $vacation); } /*else echo 'Format de date incorrect<br />';*/ } /**
  • @desc Ajoute des jours au tableau des jours liés
*
  • @param string $eday -> jour lié à ajouter (format : 'dd/mm')
  • @return void
  • /
public function add_eday($eday, $url) { if(preg_match('#^([0-2][0-9]|3[0-1])/(0[1-9]|1[0-2])$#', $eday) && preg_match('#((https?|ftp|gopher|telnet|file|notes|ms-help):((//)|(\\\\))+[\w\d:%/;$()~_?\+-=\\\.&]*)#', $url)) { $this->ar_edays[$eday] = $url; } /*else echo 'Format de date ou d\'url incorrect<br />';*/ } } class calendar extends Abstractcalendar { /**
  • @desc Affiche la légande du calendrier
*
  • @return void
  • /
public function show_header_calendar() { echo $this->get_month() . ' ' . $this->year . '<br />'; } /**
  • @desc Construit le bloc des têtes de jours du calendrier
*
  • @return void
  • /
public function build_header_days() { if(empty($this->cout['calendar'])) { $this->cout['calendar'] = "\n\t" . '<table>' . "\n"; } $this->cout['calendar'] .= "\t\t" . '<tr>' . "\n"; for($k=1;$k<=7;$k++) { $this->cout['calendar'] .= "\t\t\t" . '<th>' . $this->ar_days[$k] . '</th>' . "\n"; } $this->cout['calendar'] .= "\t\t" . '</tr>' . "\n"; } /**
  • @desc Construit le bloc des jours du calendrier
*
  • @return void
  • /
public function build_days() { if(empty($this->cout['calendar'])) { $this->cout['calendar'] = "\n\t" . '<table>' . "\n"; } $n_days = cal_days_in_month(CAL_GREGORIAN, $this->month, $this->year); $first_day = jddayofweek(cal_to_jd(CAL_GREGORIAN, $this->month, 1, $this->year), 0); $first_day = ($first_day==0) ? 7 : ($first_day); $n_col = ceil(($n_days+$first_day-1)/7); $num_day = 1; for($l=1;$l<=$n_col;$l++) { $this->cout['calendar'] .= "\t\t" . '<tr>' . "\n"; for($m=1;$m<=7;$m++) { $cel = $m+7*($l-1); if($this->is_day($num_day, $cel)) { switch (1) { case ($this->is_today($num_day)) : $this->cout['calendar'] .= "\t\t\t" . '<td class="today">' . $num_day++ . '</td>' . "\n"; break; case ($this->is_eday($num_day)) : $url = $this->get_eday_url($num_day); $this->cout['calendar'] .= "\t\t\t" . '<td class="eday"><a href="' . $url . '">' . $num_day++ . '</a></td>' . "\n"; break; case ($this->is_vacation($num_day)) : $this->cout['calendar'] .= "\t\t\t" . '<td class="vacation">' . $num_day++ . '</td>' . "\n"; break; case ($this->is_holiday($num_day)) : $this->cout['calendar'] .= "\t\t\t" . '<td class="holiday">' . $num_day++ . '</td>' . "\n"; break; default : $this->cout['calendar'] .= "\t\t\t" . '<td class="otherday">' . $num_day++ . '</td>' . "\n"; break; } } else $this->cout['calendar'] .= "\t\t\t" . '<td class="noday">&nbsp;</td>' . "\n"; } $this->cout['calendar'] .= "\t\t" . '</tr>' . "\n"; } } /**
  • @desc Construit un calendrier standard
*
  • @return void
  • /
public function build_std_calendar() { $this->build_header_days(); $this->build_days(); } /**
  • @desc Affiche le calendrier
*
  • @return void
  • /
public function show_calendar() { if(empty($this->cout['calendar'])) { $this->build_std_calendar(); } $this->cout['calendar'] .= "\t" . '</table>' . "\n"; echo $this->cout['calendar']; $this->cout['calendar'] = ''; } } /* Utilisation : Calendrier standard : $month = date('n'); $year = date('Y'); $calendar = new calendar($month, $year); $calendar->show_header_calendar(); $calendar->show_calendar(); Méthodes : $month = date('n'); $year = date('Y'); $calendar = new calendar($month, $year); $calendar->add_holiday('09/03'); $calendar->add_holiday('12/03->24/03'); $calendar->add_vacation('09/03'); $calendar->add_vacation('12/03->24/03'); $calendar->add_eday('10/03', 'http://kik.s.free.fr/test/test.php'); echo $calendar->get_month(); $calendar->show_header_calendar(); $calendar->build_header_days(); $calendar->build_days(); $calendar->show_calendar(); Requis : Fichier CSS contenant : .today -> class pour l'affichage de la case du jour .otherday -> class pour l'affichage des cases des autres jours .holiday -> class pour l'affichage des jours fériés .vacation -> class pour l'affichage des jours de vacances .eday -> class pour l'affichage des jours liés .noday -> class pour l'affichage des cases sans jour
  • /
?>

Conclusion :


Merci de laisser vos idées, observations ou suggestions pour faire évoluer cette source.

Codes Sources

A voir également

Ajouter un commentaire Commentaires
Mister Jingles Messages postés 4 Date d'inscription samedi 6 janvier 2007 Statut Membre Dernière intervention 25 février 2009
25 févr. 2009 à 20:42
Merci pour le commentaire constructif, ça apporte énormément au débutant que je suis et ça fait toujours plaisir. Je vais me pencher sur la question assez rapidement je pense pour completer et améliorer cette petite classe.

^_^
aKheNathOn Messages postés 276 Date d'inscription dimanche 22 juillet 2001 Statut Modérateur Dernière intervention 5 décembre 2013
25 févr. 2009 à 16:46
ça serait bien de pouvoir attacher une url à une date, avec un tableau de données par exemple. Comme ça la calendrier deviendrait un élément beaucoup plus dynamique.

ça serait sympa d'avoir une classe différente selon un jour férié ou pas.

C'est indispensable qu'effectivement tu créés un découpage de la chaine générée sinon impossible de le modifier proprement.

Bonne continuation,
Akh
jeguetto Messages postés 6 Date d'inscription mardi 23 novembre 2004 Statut Membre Dernière intervention 25 février 2009
25 févr. 2009 à 13:57
Merci de votre rapidité, je travaille sur autre chose mais j'ai déjà un élément de réponse.

Merci encore

@+
Mister Jingles Messages postés 4 Date d'inscription samedi 6 janvier 2007 Statut Membre Dernière intervention 25 février 2009
25 févr. 2009 à 13:44
Bonjour,

L'erreur indique que la classe a été mal incluse.

Le : require_once $_SERVER['DOCUMENT_ROOT'] . '/class_calendar.php'; présent dans le fichier test.php est tout simplement un include un peu perfectionné. On pourrait le remplacer par : include 'class_calendar.php';

Après, la classe peut être instancée simplement, comme en pied de classe ou comme dans le fichier test.php.

J'espère que mes explications pourront vous aider.

A plus.
jeguetto Messages postés 6 Date d'inscription mardi 23 novembre 2004 Statut Membre Dernière intervention 25 février 2009
25 févr. 2009 à 13:14
Bonjour à vous,

Désolé de ma naïveté mais je souhaite utiliser votre script car il me paraît plus simple que beaucoup. J'essaie de l'insérer dans un formulaire (choix de la date > récupération de la date dans une base de donnée sql) mais j'ai du m'embrouiller quelque part, cela ne fonctionne pas...

Pourriez-vous m'éclairer ? Quelle partie de code dois-je insérer dans mon formulaire et comment adapter : require_once $_SERVER['DOCUMENT_ROOT'] . '/class_calendar.php';

Quand je lance un aperçu, j'ai ce message d'erreur
Fatal error: Cannot instantiate non-existent class: calendar in c:\program files\easyphp1-8\www\...\multquestionnaire.php on line 482

La ligne 482 correspond à ça : $calendar = new calendar($month, $year);

J'espere que vous pourrez m'éclairer

Afficher les 7 commentaires

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.