Календарь на PHP

PHP-класс для вывода календаря на месяц, год или любой другой интервал с возможностью выделить отдельные даты и вывести к ним подсказки.

  1. class Calendar
  2. {
  3. /**
  4. * Вывод календаря на один месяц.
  5. */
  6. public static function getMonth($month, $year, $events = array())
  7. {
  8. $months = array(
  9. 1 => 'Январь',
  10. 2 => 'Февраль',
  11. 3 => 'Март',
  12. 4 => 'Апрель',
  13. 5 => 'Май',
  14. 6 => 'Июнь',
  15. 7 => 'Июль',
  16. 8 => 'Август',
  17. 9 => 'Сентябрь',
  18. 10 => 'Октябрь',
  19. 11 => 'Ноябрь',
  20. 12 => 'Декабрь'
  21. );
  22.  
  23. $month = intval($month);
  24. $out = '
  25. <div class="calendar-item">
  26. <div class="calendar-head">' . $months[$month] . ' ' . $year . '</div>
  27. <table>
  28. <tr>
  29. <th>Пн</th>
  30. <th>Вт</th>
  31. <th>Ср</th>
  32. <th>Чт</th>
  33. <th>Пт</th>
  34. <th>Сб</th>
  35. <th>Вс</th>
  36. </tr>';
  37.  
  38. $day_week = date('N', mktime(0, 0, 0, $month, 1, $year));
  39. $day_week--;
  40.  
  41. $out.= '<tr>';
  42.  
  43. for ($x = 0; $x < $day_week; $x++) {
  44. $out.= '<td></td>';
  45. }
  46.  
  47. $days_counter = 0;
  48. $days_month = date('t', mktime(0, 0, 0, $month, 1, $year));
  49.  
  50. for ($day = 1; $day <= $days_month; $day++) {
  51. if (date('j.n.Y') == $day . '.' . $month . '.' . $year) {
  52. $class = 'today';
  53. } elseif (time() > strtotime($day . '.' . $month . '.' . $year)) {
  54. $class = 'last';
  55. } else {
  56. $class = '';
  57. }
  58.  
  59. $event_show = false;
  60. $event_text = array();
  61. if (!empty($events)) {
  62. foreach ($events as $date => $text) {
  63. $date = explode('.', $date);
  64. if (count($date) == 3) {
  65. $y = explode(' ', $date[2]);
  66. if (count($y) == 2) {
  67. $date[2] = $y[0];
  68. }
  69.  
  70. if ($day == intval($date[0]) && $month == intval($date[1]) && $year == $date[2]) {
  71. $event_show = true;
  72. $event_text[] = $text;
  73. }
  74. } elseif (count($date) == 2) {
  75. if ($day == intval($date[0]) && $month == intval($date[1])) {
  76. $event_show = true;
  77. $event_text[] = $text;
  78. }
  79. } elseif ($day == intval($date[0])) {
  80. $event_show = true;
  81. $event_text[] = $text;
  82. }
  83. }
  84. }
  85.  
  86. if ($event_show) {
  87. $out.= '<td class="calendar-day ' . $class . ' event">' . $day;
  88. if (!empty($event_text)) {
  89. $out.= '<div class="calendar-popup">' . implode('<br>', $event_text) . '</div>';
  90. }
  91. $out.= '</td>';
  92. } else {
  93. $out.= '<td class="calendar-day ' . $class . '">' . $day . '</td>';
  94. }
  95.  
  96. if ($day_week == 6) {
  97. $out.= '</tr>';
  98. if (($days_counter + 1) != $days_month) {
  99. $out.= '<tr>';
  100. }
  101. $day_week = -1;
  102. }
  103.  
  104. $day_week++;
  105. $days_counter++;
  106. }
  107.  
  108. $out .= '</tr></table></div>';
  109. return $out;
  110. }
  111.  
  112. /**
  113. * Вывод календаря на несколько месяцев.
  114. */
  115. public static function getInterval($start, $end, $events = array())
  116. {
  117. $curent = explode('.', $start);
  118. $curent[0] = intval($curent[0]);
  119.  
  120. $end = explode('.', $end);
  121. $end[0] = intval($end[0]);
  122.  
  123. $begin = true;
  124. $out = '<div class="calendar-wrp">';
  125. do {
  126. $out .= self::getMonth($curent[0], $curent[1], $events);
  127.  
  128. if ($curent[0] == $end[0] && $curent[1] == $end[1]) {
  129. $begin = false;
  130. }
  131.  
  132. $curent[0]++;
  133. if ($curent[0] == 13) {
  134. $curent[0] = 1;
  135. $curent[1]++;
  136. }
  137. } while ($begin == true);
  138.  
  139. $out .= '</div>';
  140. return $out;
  141. }
  142. }

CSS-стили:
  1. .calendar-item {
  2. width: 200px;
  3. display: inline-block;
  4. vertical-align: top;
  5. margin: 0 16px 20px;
  6. font: 14px/1.2 Arial, sans-serif;
  7. }
  8. .calendar-head {
  9. text-align: center;
  10. padding: 5px;
  11. font-weight: 700;
  12. font-size: 14px;
  13. }
  14. .calendar-item table {
  15. border-collapse: collapse;
  16. width: 100%;
  17. }
  18. .calendar-item th {
  19. font-size: 12px;
  20. padding: 6px 7px;
  21. text-align: center;
  22. color: #888;
  23. font-weight: normal;
  24. }
  25. .calendar-item td {
  26. font-size: 13px;
  27. padding: 6px 5px;
  28. text-align: center;
  29. border: 1px solid #ddd;
  30. }
  31. .calendar-item tr th:nth-child(6), .calendar-item tr th:nth-child(7),
  32. .calendar-item tr td:nth-child(6), .calendar-item tr td:nth-child(7) {
  33. color: #e65a5a;
  34. }
  35. .calendar-day.last {
  36. color: #999 !important;
  37. }
  38. .calendar-day.today {
  39. font-weight: bold;
  40. }
  41. .calendar-day.event {
  42. background: #ffe2ad;
  43. position: relative;
  44. cursor: pointer;
  45. }
  46. .calendar-day.event:hover .calendar-popup {
  47. display: block;
  48. }
  49. .calendar-popup {
  50. display: none;
  51. position: absolute;
  52. top: 40px;
  53. left: 0;
  54. min-width: 200px;
  55. padding: 15px;
  56. background: #fff;
  57. text-align: left;
  58. font-size: 13px;
  59. z-index: 100;
  60. box-shadow: 0 0 10px rgba(0,0,0,0.5);
  61. color: #000;
  62. }
  63. .calendar-popup:before {
  64. content: "";
  65. border: solid transparent;
  66. position: absolute;
  67. left: 8px;
  68. bottom: 100%;
  69. border-bottom-color: #fff;
  70. border-width: 9px;
  71. margin-left: 0;
  72. }

Вывод календаря на текущий месяц:
  1. echo Calendar::getMonth(date('n'), date('Y'));

Календарь на три месяца
  1. echo Calendar::getInterval(date('n.Y'), date('n.Y', strtotime('+2 month')));

Календарь на год:
Вывод календаря на текущий год с выделенными днями праздников и других событий.
В массиве $events даты могут быть в следующем формате:

d – день месяца, при таком формате, заданный день будет выделятся каждый месяц.
d.m – день и месяц, такая дата будет выделятся раз в год.
d.m.Y или d.m.Y H:i – точная дата.
  1. $events = array(
  2. '16' => 'Заплатить ипотеку',
  3. '23.02' => 'День защитника Отечества',
  4. '08.03' => 'Международный женский день',
  5. '31.12' => 'Новый год'
  6. );
  7.  
  8. echo Calendar::getInterval(date('01.Y'), date('12.Y'), $events);


  19.01.24 / 16:20 | PHP |   50 | 0   0