PHP-класс для вывода календаря на месяц, год или любой другой интервал с возможностью выделить отдельные даты и вывести к ним подсказки.
class Calendar
{
/**
* Вывод календаря на один месяц.
*/
public static function getMonth($month, $year, $events = array())
{
$months = array(
1 => 'Январь',
2 => 'Февраль',
3 => 'Март',
4 => 'Апрель',
5 => 'Май',
6 => 'Июнь',
7 => 'Июль',
8 => 'Август',
9 => 'Сентябрь',
10 => 'Октябрь',
11 => 'Ноябрь',
12 => 'Декабрь'
);
$month = intval($month);
$out = '
<div class="calendar-item">
<div class="calendar-head">' . $months[$month] . ' ' . $year . '</div>
<table>
<tr>
<th>Пн</th>
<th>Вт</th>
<th>Ср</th>
<th>Чт</th>
<th>Пт</th>
<th>Сб</th>
<th>Вс</th>
</tr>';
$day_week = date('N', mktime(0, 0, 0, $month, 1, $year));
$day_week--;
$out.= '<tr>';
for ($x = 0; $x < $day_week; $x++) {
$out.= '<td></td>';
}
$days_counter = 0;
$days_month = date('t', mktime(0, 0, 0, $month, 1, $year));
for ($day = 1; $day <= $days_month; $day++) {
if (date('j.n.Y') == $day . '.' . $month . '.' . $year) {
$class = 'today';
} elseif (time() > strtotime($day . '.' . $month . '.' . $year)) {
$class = 'last';
} else {
$class = '';
}
$event_show = false;
$event_text = array();
if (!empty($events)) {
foreach ($events as $date => $text) {
$date = explode('.', $date);
if (count($date) == 3) {
$y = explode(' ', $date[2]);
if (count($y) == 2) {
$date[2] = $y[0];
}
if ($day == intval($date[0]) && $month == intval($date[1]) && $year == $date[2]) {
$event_show = true;
$event_text[] = $text;
}
} elseif (count($date) == 2) {
if ($day == intval($date[0]) && $month == intval($date[1])) {
$event_show = true;
$event_text[] = $text;
}
} elseif ($day == intval($date[0])) {
$event_show = true;
$event_text[] = $text;
}
}
}
if ($event_show) {
$out.= '<td class="calendar-day ' . $class . ' event">' . $day;
if (!empty($event_text)) {
$out.= '<div class="calendar-popup">' . implode('<br>', $event_text) . '</div>';
}
$out.= '</td>';
} else {
$out.= '<td class="calendar-day ' . $class . '">' . $day . '</td>';
}
if ($day_week == 6) {
$out.= '</tr>';
if (($days_counter + 1) != $days_month) {
$out.= '<tr>';
}
$day_week = -1;
}
$day_week++;
$days_counter++;
}
$out .= '</tr></table></div>';
return $out;
}
/**
* Вывод календаря на несколько месяцев.
*/
public static function getInterval($start, $end, $events = array())
{
$curent = explode('.', $start);
$curent[0] = intval($curent[0]);
$end = explode('.', $end);
$end[0] = intval($end[0]);
$begin = true;
$out = '<div class="calendar-wrp">';
do {
$out .= self::getMonth($curent[0], $curent[1], $events);
if ($curent[0] == $end[0] && $curent[1] == $end[1]) {
$begin = false;
}
$curent[0]++;
if ($curent[0] == 13) {
$curent[0] = 1;
$curent[1]++;
}
} while ($begin == true);
$out .= '</div>';
return $out;
}
}
CSS-стили:
.calendar-item {
width: 200px;
display: inline-block;
vertical-align: top;
margin: 0 16px 20px;
font: 14px/1.2 Arial, sans-serif;
}
.calendar-head {
text-align: center;
padding: 5px;
font-weight: 700;
font-size: 14px;
}
.calendar-item table {
border-collapse: collapse;
width: 100%;
}
.calendar-item th {
font-size: 12px;
padding: 6px 7px;
text-align: center;
color: #888;
font-weight: normal;
}
.calendar-item td {
font-size: 13px;
padding: 6px 5px;
text-align: center;
border: 1px solid #ddd;
}
.calendar-item tr th:nth-child(6), .calendar-item tr th:nth-child(7),
.calendar-item tr td:nth-child(6), .calendar-item tr td:nth-child(7) {
color: #e65a5a;
}
.calendar-day.last {
color: #999 !important;
}
.calendar-day.today {
font-weight: bold;
}
.calendar-day.event {
background: #ffe2ad;
position: relative;
cursor: pointer;
}
.calendar-day.event:hover .calendar-popup {
display: block;
}
.calendar-popup {
display: none;
position: absolute;
top: 40px;
left: 0;
min-width: 200px;
padding: 15px;
background: #fff;
text-align: left;
font-size: 13px;
z-index: 100;
box-shadow: 0 0 10px rgba(0,0,0,0.5);
color: #000;
}
.calendar-popup:before {
content: "";
border: solid transparent;
position: absolute;
left: 8px;
bottom: 100%;
border-bottom-color: #fff;
border-width: 9px;
margin-left: 0;
}
Далее приведены варианты использования класса и живые примеры.
Вывод календаря на текущий месяц:
Результат:
Результат:
Вывод календаря на текущий год с выделенными днями праздников и других событий.
В массиве $events
даты могут быть в следующем формате:
d
– день месяца, при таком формате, заданный день будет выделятся каждый месяц.d.m
– день и месяц, такая дата будет выделятся раз в год.d.m.Y
илиd.m.Y H:i
– точная дата.
$events = array(
'16' => 'Заплатить ипотеку',
'23.02' => 'День защитника Отечества',
'08.03' => 'Международный женский день',
'31.12' => 'Новый год'
);
echo Calendar::getInterval(date('01.Y'), date('12.Y'), $events);
Результат:
Календарь на 12 месяцев, начиная с текущего
$events = array(
'16' => 'Заплатить ипотеку',
'23.02' => 'День защитника Отечества',
'08.03' => 'Международный женский день',
'31.12' => 'Новый год'
);
echo Calendar::getInterval(date('n.Y'), date('n.Y', strtotime('+11 month')), $events);
плодит не закрытые div
наверное надо так
и теперь события появляются все
А что-то еще меняли?
$events = array();
$Deadlines = "SELECT Forms.*, Deadlines.*, DATE_FORMAT(start_date, '%d.%m.%Y') as st_date, DATE_FORMAT(end_date, '%d.%m.%Y') as e_date FROM Forms, Deadlines WHERE Forms.form_id=Deadlines.form_id";
$dead = mysqli_query($connection, $Deadlines);
while($deadd = mysqli_fetch_assoc($dead)){
$events[$deadd['st_date']] = 'Начало срока сдачи отчета по форме '.$deadd['form_index'];
$events[$deadd['e_date']] = 'Конец срока сдачи отчета по форме '.$deadd['form_index'];
}
1. Как добавить ссылку при нажатии на день с событием что бы по ней куда то переходило ?
2. И на само событие если их в этот день несколько (но ссылка на день оставалась бы)
и желательно данные передавать единым массивом
мне нужно что бы кроме текста туда еще картинку выводить и ссылку обычную
как это можно сделать?
к примеру
'16' => 'Заплатить ипотеку' 'https://snipp.ru/uploads/users/32x32/0848c43e8b64078fe97cd3f560add056e9d7a5e9.jpg',