Event Calendar

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

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

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

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

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

Логика

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

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

)-(2)-(6)$/"; 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); 

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

Читайте также:  Php file get contents save file

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

$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 без дополнительных библиотек.

Литература

Источник

Event Calendar with PHP

Event Calendar with PHP

In this article, I have developed an event calendar class that will populate all the days in a month based on the specified date, along with the events that we can add to the calendar.

While PHP doesn’t include a built-in calendar API per se (without including additional extensions), it does, however, give you a broad range of date and time methods that we can use to manipulate. In addition, we can use these methods to populate the pages showing the days, weeks, and months of a particular year.

Why should I use the calendar class?

It’s entirely up to you and your requirements. I have decided to take it upon myself to write my own class as I work on many projects that require an event-based calendar system. I’ve searched countless times for a minimal, dependency-free, and modern library. But couldn’t find one that I could seamlessly integrate with my projects. Therefore, I created a PHP class that can easily be integrated with any project, whether the project’s size is small or large.

Source

Create a new file Calendar.php and add the following code:

active_year = $date != null ? date('Y', strtotime($date)) : date('Y'); $this->active_month = $date != null ? date('m', strtotime($date)) : date('m'); $this->active_day = $date != null ? date('d', strtotime($date)) : date('d'); > public function add_event($txt, $date, $days = 1, $color = '') < $color = $color ? ' ' . $color : $color; $this->events[] = [$txt, $date, $days, $color]; > public function __toString() < $num_days = date('t', strtotime($this->active_day . '-' . $this->active_month . '-' . $this->active_year)); $num_days_last_month = date('j', strtotime('last day of previous month', strtotime($this->active_day . '-' . $this->active_month . '-' . $this->active_year))); $days = [0 => 'Sun', 1 => 'Mon', 2 => 'Tue', 3 => 'Wed', 4 => 'Thu', 5 => 'Fri', 6 => 'Sat']; $first_day_of_week = array_search(date('D', strtotime($this->active_year . '-' . $this->active_month . '-1')), $days); $html = '
active_year . '-' . $this->active_month . '-' . $this->active_day)); $html .= '
'; $html .= '
'; $html .= '
'; > for ($i = $first_day_of_week; $i > 0; $i--) < $html .= '
' . ($num_days_last_month-$i+1) . '
'; > for ($i = 1; $i active_day) < $selected = ' selected'; >$html .= '
'; $html .= '' . $i . ''; foreach ($this->events as $event) < for ($d = 0; $d active_year . '-' . $this->active_month . '-' . $i . ' -' . $d . ' day')) == date('y-m-d', strtotime($event[1]))) < $html .= '
'; $html .= $event[0]; $html .= '
'; > > > $html .= '
'; > for ($i = 1; $i ' . $i . '
'; > $html .= '
'; $html .= '
'; return $html; > > ?>

Add the following code to your stylesheet (CSS) or create a new file calendar.css:

.calendar < display: flex; flex-flow: column; >.calendar .header .month-year < font-size: 20px; font-weight: bold; color: #636e73; padding: 20px 0; >.calendar .days < display: flex; flex-flow: wrap; >.calendar .days .day_name < width: calc(100% / 7); border-right: 1px solid #2c7aca; padding: 20px; text-transform: uppercase; font-size: 12px; font-weight: bold; color: #818589; color: #fff; background-color: #448cd6; >.calendar .days .day_name:nth-child(7) < border: none; >.calendar .days .day_num < display: flex; flex-flow: column; width: calc(100% / 7); border-right: 1px solid #e6e9ea; border-bottom: 1px solid #e6e9ea; padding: 15px; font-weight: bold; color: #7c878d; cursor: pointer; min-height: 100px; >.calendar .days .day_num span < display: inline-flex; width: 30px; font-size: 14px; >.calendar .days .day_num .event < margin-top: 10px; font-weight: 500; font-size: 14px; padding: 3px 6px; border-radius: 4px; background-color: #f7c30d; color: #fff; word-wrap: break-word; >.calendar .days .day_num .event.green < background-color: #51ce57; >.calendar .days .day_num .event.blue < background-color: #518fce; >.calendar .days .day_num .event.red < background-color: #ce5151; >.calendar .days .day_num:nth-child(7n+1) < border-left: 1px solid #e6e9ea; >.calendar .days .day_num:hover < background-color: #fdfdfd; >.calendar .days .day_num.ignore < background-color: #fdfdfd; color: #ced2d4; cursor: inherit; >.calendar .days .day_num.selected

How To Use

Include the class in your project and create a new instance.

include 'Calendar.php'; $calendar = new Calendar();

We can specify a date while creating a new instance:

include 'Calendar.php'; $calendar = new Calendar('2023-05-12');

Add new events to the calendar:

$calendar->add_event('Holiday', '2023-05-14');

We can specify the number of days the event should last by binding an additional value to the add_event method:

$calendar->add_event('Holiday', '2023-05-14', 7); // Event will last for 7 days

We can also change the color:

$calendar->add_event('Holiday', '2023-05-14', 7, 'red');

Only red, blue, and green will work (the default is orange). You can add more colors to the CSS file.

We can populate the calendar in HTML format with the following code:

Example Code

Create a new file example.php and add the following code:

add_event('Birthday', '2023-05-03', 1, 'green'); $calendar->add_event('Doctors', '2023-05-04', 1, 'red'); $calendar->add_event('Holiday', '2023-05-16', 7); ?>        

The stylesheet (style.css) for our example page:

* < box-sizing: border-box; font-family: -apple-system, BlinkMacSystemFont, "segoe ui", roboto, oxygen, ubuntu, cantarell, "fira sans", "droid sans", "helvetica neue", Arial, sans-serif; font-size: 16px; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; >body < background-color: #FFFFFF; margin: 0; >.navtop < background-color: #3b4656; height: 60px; width: 100%; border: 0; >.navtop div < display: flex; margin: 0 auto; width: 800px; height: 100%; >.navtop div h1, .navtop div a < display: inline-flex; align-items: center; >.navtop div h1 < flex: 1; font-size: 24px; padding: 0; margin: 0; color: #ebedee; font-weight: normal; >.navtop div a < padding: 0 20px; text-decoration: none; color: #c4c8cc; font-weight: bold; >.navtop div a i < padding: 2px 8px 0 0; >.navtop div a:hover < color: #ebedee; >.content < width: 800px; margin: 0 auto; >.content h2

And now, if we navigate to our example page, it will appear similar to the following:

Event Calendar PHP

If you don’t see any events populated on the calendar, make sure the dates are correct, and your server timezone is set correctly. You can change the timezone with the below code.

date_default_timezone_set('America/Los_Angeles');

The full list of supported timezones are available here.

Conclusion

While the calendar class I’ve created is not a complete solution, it will most definitely help you integrate the class into any project seamlessly and extend the base code.

Drop a comment below and let me know if you encounter any issues with the class. Don’t forget to follow us on social media and share our articles, as this will help our website grow, and we can provide more quality content.

Released under the MIT License. If you’re going to redistribute the code, please include my name and link to this article. Thanks!

If you would like to support us, consider purchasing the advanced event calendar system below as it will greatly help us create more tutorials and keep our website up and running. The advanced package includes improved code and more features.

Источник

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

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

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

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

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

Логика

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

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

)-(3)-(3)$/"; 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 без дополнительных библиотек.

Литература

Источник

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