Календарь на php пример

Создание PHP календаря

В этой статье я расскажу как создать функциональный календарь с использованием PHP. Около года назад мне поручили сделать календарь событий на одном сайте. Заказчик не очень жаловал javascript или ajax, поэтому настоял на использовании PHP. Это было довольно интересный опыт. Мне пришлось забыть свои мечты о быстром выполнении заказа с использованием jQuery datepicker. Я уже приготовился к тому, что мне предстоит тяжелая работа. Потом меня осенило. Ведь календарь, по сути, является ни чем иным как системой циклических чисел. Чем больше я об этом думал, тем легче мне начинала казаться задача. В конце концов, после небольшого исследования о функциях даты PHP, я придумал способ, который действительно сработал. Рабочий пример можно скачать здесь.

Начнем с установки нескольких переменных среды. Очевидно, что нам необходимо знать URL нашего скрипта, и, поскольку мы работаем с календарем, нам нужна дата, от которой мы будем отталкиваться. Нам нужно проверить, указывает ли назначенная на наш URL переменная на конкретный год, месяц и день. Если нет, то мы начнем с сегодняшней даты.

Следующая задача будем немного сложнее, чем кажется, когда мы впишем ее в код. Мне нужно было изменить год, когда наступал следующий за декабрем месяц. Позже вы увидите, что то же самое нужно будет делать и на тот случай, если календарь будет просматриваться в обратную сторону.

Теперь давайте используем установленные выше значения месяца и года, чтобы выяснить, на какой день выпадет начало нового месяца. К счастью, mktime идеально подойдет для этой задачи. Если кто не знает, в mktime передаются следующие значения: Час, Минута, Секунда, Месяц, День и Год. Затем он выдает временную метку Unix для этого момента времени.

Читайте также:  Python bind all tkinter

Как видите, мы потратили достаточно много времени на то, чтобы убедиться, что мы знаем наше положение во времени и можем влиять на то, что произойдет, когда значения дней, лет и месяцев будут уменьшаться или увеличиваться при просмотре календаря. Важно помнить, что при работе с датами всегда полезно устанавливать значения по умолчанию, прежде чем приступать к созданию кода. Нельзя точно знать, что вам понадобиться, но по ходу выполнения задачи вам почти наверняка нужно будет узнать текущий день, месяц и год. Мы снова используем функцию даты() в PHP и mktime(), чтобы точно манипулировать числами. Далее мы начинаем чертить календарь.

Выше мы сделали заголовок таблицы и ссылки навигации, чтобы переходить вперед и назад по месяцам и годам в календаре. Теперь мы печатаем дни, выделяя сегодняшнюю дату. Каждый день – это ссылка на тот день, на который мы можем перейти. Теперь будет просто создать систему событий, так как день, месяц и год, на которые вы кликаете, указывает на URL, благодаря чему вы можете просматривать установки и показывать события согласно этому.

Хотите — верьте, хотите – нет, но на этом все. Теперь можно кликать на каждый день календаря, переходить на месяцы и годы, нажимая на стрелки рядом с названием месяца в заголовке таблицы. Сегодняшняя дата отличается от всех остальных своим классом CSS, поэтому ее можно стилизовать по своему усмотрению, и у нас получился довольно гибкий календарь. В завершение хочу включить в наш проект небольшую форму, которая позволит вам переходить на любой месяц любого года на двадцать лет вперед. Также хочу предложить ссылку для перехода на текущий месяц. Код очень простой:

Читайте также:  Тег TD, атрибут rowspan

Источник

Как написать php календарь на месяц и на год?

В преддверии нового года возникла весьма тривиальная задача — сделать сайт-календарь, где для каждого месяца необходимо было вывести свой календарь на месяц. Первым этапом решения задачи — стал поиск готовых решений. После перебора десятка приведенных в интернете решений выбор был сделан. Какие-то версии и вовсе оказались нерабочими, какие-то слишком громоздкими — их пришлось бы изрядно «попилить», чтобы получить требуемый результат. Итак, рассмотрим как написать простой календарь на php.

Основа скрипта была найдена на просторах интернета, ошибки были исправлены, кое-что было доделано, в частности добавлена функциональность выделения выходных дней отдельным css-классом.

PHP календарь на месяц

Реализация календаря на месяц на чистом PHP без использования mySQL, jQuery и т.д. приведена ниже:

'; // вывод дней недели $headings = array('Пн','Вт','Ср','Чт','Пт','Сб','Вс'); $calendar.= ''; for($head_day = 0; $head_day '; $calendar.= '
'.$headings[$head_day].'
'; $calendar.= ''; > $calendar.= ''; // выставляем начало недели на понедельник $running_day = date('w',mktime(0,0,0,$month,1,$year)); $running_day = $running_day - 1; if ($running_day == -1) < $running_day = 6; >$days_in_month = date('t',mktime(0,0,0,$month,1,$year)); $day_counter = 0; $days_in_this_week = 1; $dates_array = array(); // первая строка календаря $calendar.= ''; // вывод пустых ячеек for ($x = 0; $x '; $days_in_this_week++; > // дошли до чисел, будем их писать в первую строку for($list_day = 1; $list_day '; // пишем номер в ячейку $calendar.= '
'.$list_day.'
'; $calendar.= ''; // дошли до последнего дня недели if ($running_day == 6) < // закрываем строку $calendar.= ''; // если день не последний в месяце, начинаем следующую строку if (($day_counter + 1) != $days_in_month) < $calendar.= ''; > // сбрасываем счетчики $running_day = -1; $days_in_this_week = 0; > $days_in_this_week++; $running_day++; $day_counter++; > // выводим пустые ячейки в конце последней недели if ($days_in_this_week '; > > $calendar.= ''; $calendar.= ''; return $calendar; > ?>

На вход функция draw_calendar получает порядковый номер месяца и год. Результатом исполнения функции является html-код календаря на заданный месяц. Использовать вышеприведенную функцию несложно, и сможет даже новичок в веб-разработке. Пример ниже выведет календарь на январь 2016 год.

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

Php-календарь на год

Из приведнной выше функции можно легко получить php-скрипт календаря на год, причем на любой. Для этого достаточно в цикле перебрать все месяцы и для каждого из них вызвать функцию вывода календаря на месяц.

PHP календарь на год

Однако при этом потребуется завести массив со списком названий месяцев на русском языке, поскольку получить названия месяцев из php можно лишь на английском.

Код в таком случае будет следующим:

 'Январь', 1 => 'Февраль', 2 => 'Март', 3 => 'Апрель', 4 => 'Май', 5 => 'Июнь', 6 => 'Июль', 7 => 'Август', 8 => 'Сентябрь', 9 => 'Октябрь', 10 => 'Ноябрь', 11 => 'Декабрь' ); for ($month = 1; $month  
'16
?>

Примеры приведенные в данном посте вы можете скачать с гитхаба.

Источник

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

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 = ' 
'; $day_week = date('N', mktime(0, 0, 0, $month, 1, $year)); $day_week--; $out.= ''; for ($x = 0; $x '; > $days_counter = 0; $days_month = date('t', mktime(0, 0, 0, $month, 1, $year)); for ($day = 1; $day 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.= ''; > else < $out.= ''; > if ($day_week == 6) < $out.= ''; if (($days_counter + 1) != $days_month) < $out.= ''; > $day_week = -1; > $day_week++; $days_counter++; > $out .= '
Пн Вт Ср Чт Пт Сб Вс
' . $day; if (!empty($event_text)) < $out.= '
', $event_text) . '
'; > $out.= '
' . $day . '
'; 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 = '
$curent[0]++; if ($curent[0] == 13) < $curent[0] = 1; $curent[1]++; >> while ($begin == true); $out .= '
'; return $out; > >
.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

Далее приведены варианты использования класса и живые примеры.

Календарь на месяц

Вывод календаря на текущий месяц:

echo Calendar::getMonth(date('n'), date('Y'));

Источник

Календарь событий PHP + Javascript

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

Задача вроде бы не сложная, но среди немногочисленных решений в интернете я не нашел подходящего по следующим причинам: слишком сложный и непонятный код, медленные запросы к БД (это особенно ощущается, если в базе много записей), использование библиотеки jQuery, к которой я отношусь не очень хорошо.

Итак, к плюсам моего календаря можно отнесли следующее:

  1. Весь код помещается в 200 строчек и состоит из одного файла, который подключается через include
  2. Скрипт состоит из чистого php + javascript без использования библиотеки jQuery
  3. Используются простые и оптимизированные запросы к БД
  4. Подгрузка следующего (предыдущего) месяца происходит через AJAX

Логика

Календарь генерируется средствами php для текущего месяца. Для каждого дня проверяем нет ли записей в БД, если есть, — формируем ссылку на событие. Дописываем javascript код для перелистывание месяцев, который обращается к скрипту через ajax. Задача усложняется тем, что события растянуты во времени, то есть, начинаются в один день, а заканчиваются через несколько дней или даже месяцев. На всем временном промежутке существование события нужно его подсветить ссылкой для каждого дня.

Генерируем календарь на PHP

)-(1)-(9)$/"; if (preg_match($pattern, $_REQUEST['date'])) < $date = $_REQUEST['date']; >else < die('Неправильный параметр'); >> else < $date=date("Y-m-d"); >$sd = explode("-", $date); $year = $sd[0]; $month = $sd[1]; $day = $sd[2]; // Вычисляем число дней в текущем месяце $dayofmonth = date('t', mktime(0, 0, 0, $month, 1, $year)); //Готовим запрос к БД $todate = "$year-$month-$dayofmonth"; $fromdate = "$year-$month-01"; $query ; $res_db = $db->sql($query); 

Таким образом, мы выбрали все записи, которые есть в текущем месяце.

Дальше самое интересное: заполняем обходочный массив. Для того, чтобы не крутить лишний раз все заново, если находится соответствие, элемент массива удаляется и следующий цикл имеет меньше итераций.

$d = array();$k=array(); for($i = 1; $i $i=0; while ($a = mysqli_fetch_row($res_db)) < //for($i = 1; $i= $a[0] && $cd > > 
// Счётчик для дней месяца $day_count = 1; // 1. Первая неделя $num = 0; for($i = 0; $i < 7; $i++) < // Вычисляем номер дня недели для числа $dayofweek = date('w', mktime(0, 0, 0, $month, $day_count, $year)); // Приводим к числа к формату 1 - понедельник, . 6 - суббота $dayofweek = $dayofweek - 1; if($dayofweek == -1) $dayofweek = 6; if($dayofweek == $i) < // Если дни недели совпадают, // заполняем массив $week // числами месяца $week[$num][$i] = $day_count; $day_count++; >else < $week[$num][$i] = ""; >> // 2. Последующие недели месяца while(true) < $num++; for($i = 0; $i < 7; $i++) < $week[$num][$i] = $day_count; $day_count++; // Если достигли конца месяца - выходим // из цикла if($day_count >$dayofmonth) break; > // Если достигли конца месяца - выходим // из цикла if($day_count > $dayofmonth) break; > // 3. Выводим содержимое массива $week // в виде календаря // Выводим таблицу echo ''; //заголовок $rusdays = array('ПН','ВТ','СР','ЧТ','ПТ','СБ','ВС'); $rusmonth = array('Январь','Февраль','Март','Апрель','Май','Июнь','Июль','Август','Сентябрь','Октябрь','Ноябрь','Декабрь'); echo '   '.$rusmonth[$month-1].', '.$year.' > '; echo ''; foreach ($rusdays as $rusday)< echo ''.$rusday.''; > echo ''; echo ''; //тело календаря for($i = 0; $i < count($week); $i++) < echo ""; for($j = 0; $j < 7; $j++) < if(!empty($week[$i][$j])) < // Если имеем дело с выбраной датой подсвечиваем ee if($week[$i][$j]==$day) < echo ''; > else < echo ''; > // Если запись в базе за текущую дату есть, делаем ссылку if($d[$week[$i][$j]]) < echo ''.$week[$i][$j].''; > else < echo $week[$i][$j]; >echo ''; > else echo " "; > echo ""; > ?> 

Javascript код для перематывание месяцев

Он немного упрощен для наглядности (отсутствуют эффекты скольжения):

 var mon = parseInt(""); var year = parseInt(); function monthf(pn)< if (pn == 'next')< mon++; >else if (pn == 'prev')< mon--; >else < alert('Неправильный параметр'); return false; >if (mon > 12) < year ++; mon = 1; >if (mon < 1)< year --; mon = 12; >if ((mon < 10) && (mon >= 1)) < mon = '0'+mon; >var nextDate = year+'-'+mon+'-00'; var ajaxaddr php">"; ?> 

Выводы

Таким образом получился простой и легко встраиваемый календарь событий, который быстро работает и легко настраивается, работающий на чистом PHP+javascript без дополнительных библиотек.

Литература

Источник

Оцените статью