PHP - Calendar Class

A simple calendar class that can be customized using event callbacks.

Calendar.php

  1. <?php  
  2.  
  3.     class Calendar {     
  4.     
  5.         protected $year;     
  6.         protected $month;     
  7.         protected $day;     
  8.         protected $shortWeekdayNames = true;     
  9.         protected $dateFormat ='d-m-Y';     
  10.         protected static $weekdayNames = array(     
  11.             'Sunday',     
  12.             'Monday',     
  13.             'Tuesday',     
  14.             'Wednesday',     
  15.             'Thursday',     
  16.             'Friday',     
  17.             'Saturday'     
  18.         );     
  19.     
  20.         protected $onTitleRenderFunc = null;     
  21.         protected $onDayRenderFunc = null;     
  22.         protected $onCurrentDayRenderFunc = null;     
  23.              
  24.         protected $id;     
  25.         protected $cssClass;     
  26.              
  27.         public function __construct(){     
  28.             $this->year = date('Y');     
  29.             $this->month = date('m');     
  30.             $this->day = date('d');     
  31.         }     
  32.              
  33.         public function setId($id){     
  34.             $this->id = $id;     
  35.         }     
  36.              
  37.         public function setCssClassName($cssClass){     
  38.             $this->cssClass = $cssClass;     
  39.         }     
  40.              
  41.         public function setDate($day, $month, $year){     
  42.             $this->day = $day;     
  43.             $this->month = $month;     
  44.             $this->year = $year;     
  45.             return $this;     
  46.         }     
  47.              
  48.         public function setDateFormat($format){     
  49.             $this->dateFormat = $format;     
  50.             return $this;     
  51.         }     
  52.              
  53.         public function setShortWeekDayNames($bool){     
  54.             $this->shortWeekdayNames = $bool;     
  55.             return $this;     
  56.         }     
  57.              
  58.         public function onTitleRender($onTitleRenderFunc){     
  59.             if(is_callable($onTitleRenderFunc)){     
  60.                 $this->onTitleRenderFunc = $onTitleRenderFunc;     
  61.             }     
  62.             return $this;     
  63.         }     
  64.              
  65.         public function onDayRender($onDayRenderFunc){     
  66.             if(is_callable($onDayRenderFunc)){     
  67.                 $this->onDayRenderFunc = $onDayRenderFunc;     
  68.             }     
  69.             return $this;     
  70.         }     
  71.              
  72.         public function onCurrentDayRender($onCurrentDayRenderFunc){     
  73.             if(is_callable($onCurrentDayRenderFunc)){     
  74.                 $this->onCurrentDayRenderFunc = $onCurrentDayRenderFunc;     
  75.             }     
  76.             return $this;     
  77.         }     
  78.     
  79.         public function render(){     
  80.             $timestamp = mktime(0, 0, 0, $this->month, 1, $this->year);     
  81.             $control = '<table border= "1" id= "' . $this->id . '" class"' . $this->cssClass . '">';     
  82.                  
  83.             if($this->onTitleRenderFunc){     
  84.                 $prevMonth = mktime(0, 0, 0, $this->month-1, $this->day, $this->year);     
  85.                 $currentMonth = mktime(0, 0, 0, $this->month, $this->day, $this->year);     
  86.                 $nextMonth = mktime(0, 0, 0, $this->month+1, $this->day, $this->year);     
  87.                 $titleLabel = call_user_func_array($this->onTitleRenderFunc, array($currentMonth, $prevMonth, $nextMonth));     
  88.             }else{     
  89.                 $titleLabel = date('F - Y', $timestamp);     
  90.             }     
  91.                  
  92.             $control .= '<thead><tr><td colspan= "7">' . $titleLabel . '</td></tr><tr>';     
  93.                   
  94.             foreach(static::$weekdayNames as $name){     
  95.                 $name = ($this->shortWeekdayNames) ? substr($name, 0,3) : $name;     
  96.                 $control .='<th>'.$name.'</th>';     
  97.             }     
  98.                  
  99.             $control .='</tr></thead><tbody>';     
  100.                  
  101.             $daysInMonth = cal_days_in_month(CAL_GREGORIAN, $this->month, $this->year);     
  102.             $monthStart = getdate($timestamp);     
  103.             $weekDay = $monthStart['wday'];     
  104.                  
  105.             $totalDays = $daysInMonth + $weekDay;     
  106.             $weeks = ceil($totalDays / 7);     
  107.             $day = 0;     
  108.             $bDays = 0;     
  109.                  
  110.             for($i=0; $i < $weeks; $i++){     
  111.                 $control .= '<tr>' . PHP_EOL;     
  112.                 for($wd=0; $wd < 7; $wd++){     
  113.                     if($bDays > ($weekDay-1) && $day < $daysInMonth){     
  114.                         ++$day;     
  115.                         $cellDateTimestamp = $timestamp = mktime(0, 0, 0, $this->month, $day, $this->year);     
  116.                              
  117.                         if($this->onDayRenderFunc){     
  118.                             $dayLabel = call_user_func_array($this->onDayRenderFunc, array($day, $this->month, $this->year));     
  119.                         }else{     
  120.                             $dayLabel = $day;     
  121.                         }     
  122.                              
  123.                         if($this->onCurrentDayRenderFunc && $day == $this->day){     
  124.                             $dayLabel = call_user_func_array($this->onCurrentDayRenderFunc, array($day, $this->month, $this->year));     
  125.                         }     
  126.                              
  127.                         $control .= '<td data-date= "' . date($this->dateFormat, $cellDateTimestamp) . '">'.$dayLabel.'</td>';     
  128.                     }     
  129.                     elseif($day > $daysInMonth){     
  130.                         $control .= '<td> </td>';     
  131.                     }else{     
  132.                         ++$bDays;     
  133.                         $control .= '<td> </td>';     
  134.                     }     
  135.                          
  136.                 }     
  137.                 $control .= '</tr>' . PHP_EOL;     
  138.             }     
  139.                  
  140.             return $control . '</tbody></table>';     
  141.         }     
  142.     }     
  143. ?> 

Usage

  1. <style>   
  2.     .calendar {    
  3.         border:1px solid #EEE;    
  4.         border-collapse:collapse;    
  5.     }   
  6.     .calendar thead tr td {   
  7.         font-family: 'Tahoma';   
  8.         color:#777;   
  9.         border:0px;   
  10.     }   
  11.        
  12.     .calendar thead tr td .title {   
  13.         font-size: 22px;   
  14.         float:left;   
  15.         margin: 10px;   
  16.     }   
  17.        
  18.     .calendar thead tr td .nav {   
  19.         font-size: 22px;   
  20.         float:right;   
  21.         margin: 10px;   
  22.     }   
  23.        
  24.     .calendar thead tr td .nav a {   
  25.         border-radius: 20px;   
  26.         border:2px solid orange;   
  27.         text-decoration: none;   
  28.         color:orange;   
  29.         display: inline-block;   
  30.         width:30px;   
  31.         height: 30px;   
  32.         text-align: center;   
  33.         margin:4px;   
  34.         font-weight: bold;   
  35.     }   
  36.        
  37.     .calendar thead tr td .nav a:hover {   
  38.         background-color: orange;   
  39.         color:#FFF;   
  40.     }   
  41.        
  42.     .calendar thead tr th {   
  43.         font-family: 'Tahoma';   
  44.         color:orange;   
  45.         border:0px;   
  46.         font-weight: normal;   
  47.     }   
  48.        
  49.     .calendar tbody td {    
  50.         width:90px;    
  51.         height:90px;    
  52.         vertical-align: top;    
  53.         text-align: right;    
  54.         border:1px solid #EEE;   
  55.         font-family: 'Tahoma';   
  56.     }   
  57.        
  58.     .calendar tbody td a {   
  59.         color:#777;   
  60.         font-size:18px;    
  61.         text-decoration: none;   
  62.         padding:5px;   
  63.     }   
  64.        
  65.     .calendar tbody td a:hover {   
  66.         color:orange;   
  67.     }   
  68.        
  69.     .calendar tbody td h1 {   
  70.         color:orange;   
  71.     }   
  72. </style>   
  73.   
  74. <?php   
  75.   
  76.     include 'Calendar.php';   
  77.        
  78.     $calendar = new Calendar();   
  79.     $calendar->setCssClassName('calendar');   
  80.        
  81.     if(isset($_GET['date'])){   
  82.         list($day, $month, $year) = explode('/', $_GET['date']);   
  83.         $calendar->setDate($day,$month,$year);   
  84.     }   
  85.        
  86.     $calendar->setShortWeekDayNames(false);   
  87.     $calendar->setDateFormat('d/m/Y');   
  88.        
  89.     $calendar->onTitleRender(function($currentMonth, $prevMonth, $nextMonth){   
  90.         return '<div class= "title">' . date('F - Y', $currentMonth) . '</div>'   
  91.         . '<div class= "nav"><a href= "?date=' . date('d/m/Y', $prevMonth) . '"><</a>'    
  92.         . '<a href= "?date=' . date('d/m/Y', $nextMonth) . '">></a></div>';   
  93.     });   
  94.        
  95.     $calendar->onDayRender(function($day, $month, $year){   
  96.         return '<a href= "/event.php?date=' . "$day/$month/$year " .'">' . $day . '</a>';   
  97.     });   
  98.        
  99.     $calendar->onCurrentDayRender(function($day){   
  100.         return '<h1>' . $day . '</h1>';   
  101.     });   
  102.        
  103.     echo $calendar->render();   
  104. ?>   
  105.   

No comments:

Post a Comment