PHP календарь: скрипт календаря для сайта на PHP + HTML + CSS

PHP скрипт календаря

Одним из важных элементов на сайте является календарь, с помощью которого ваши пользователи могут отслеживать события, появления новых продуктов. Или просто читать записи или еще что только не придумаешь. Уделив несколько времени этому уроку, вы узнаете, как создать PHP скрипт календаря для своего сайта. Мы не будем ограничиваться только программированием, также обратим внимание на css и html структуру календаря. Одним словом сделаем все, от начала до конца!

CSS

Меньше слов, больше дела. Сразу же начнем из css стилей календаря. Ниже предоставленный код, совместим с проблемным браузером IE6.

/* календарь */
table.calendar    { border-left:1px solid #999; }
tr.calendar-row  {  }
td.calendar-day  { min-height:80px; font-size:11px; position:relative; } * html div.calendar-day { height:80px; }
td.calendar-day:hover  { background:#eceff5; }
td.calendar-day-np  { background:#eee; min-height:80px; } * html div.calendar-day-np { height:80px; }
td.calendar-day-head { background:#ccc; font-weight:bold; text-align:center; width:120px; padding:5px; border-bottom:1px solid #999; border-top:1px solid #999; border-right:1px solid #999; }
div.day-number    { background:#999; padding:5px; color:#fff; font-weight:bold; float:right; margin:-5px -5px 0 0; width:20px; text-align:center; }
td.calendar-day, td.calendar-day-np { width:120px; padding:5px; border-bottom:1px solid #999; border-right:1px solid #999; }

PHP

Весь PHP код скрипта календаря, в основном базируется на одной функции, которая требует два параметра: желаемый месяц и год. Следует отметить, в средине функции, я оставил место для mysql запроса к базе данных. Если хотите, можете выводить необходимые события в сетку календаря. При написании этого скрипта, я использовал таблицы, вместо div блоков, так как они более практичны в случае, если один день будет пресыщен событиями.

За основу брался англоязычный скрипт календаря, поэтому предоставлю две версии: календарь в английском и русском стиле. Выбирайте, какой вам по душе! Разница только в PHP коде. CSS стили остаются прежними, для обеих вариантов.

PHP скрипт календаря в русском стиле

/* Функция генерации календаря */
function draw_calendar($month,$year){

  /* Начало таблицы */
  $calendar = '<table cellpadding="0" cellspacing="0" class="calendar">';

  /* Заглавия в таблице */
  $headings = array('Понедельник','Вторник','Среда','Четверг','Пятница','Субота','Воскресенье');
  $calendar.= '<tr class="calendar-row"><td class="calendar-day-head">'.implode('</td><td class="calendar-day-head">',$headings).'</td></tr>';

  /* необходимые переменные дней и недель... */
  $running_day = date('w',mktime(0,0,0,$month,1,$year));
  $running_day = $running_day - 1;
  $days_in_month = date('t',mktime(0,0,0,$month,1,$year));
  $days_in_this_week = 1;
  $day_counter = 0;
  $dates_array = array();

  /* первая строка календаря */
  $calendar.= '<tr class="calendar-row">';

  /* вывод пустых ячеек в сетке календаря */
  for($x = 0; $x < $running_day; $x++):
    $calendar.= '<td class="calendar-day-np"> </td>';
    $days_in_this_week++;
  endfor;

  /* дошли до чисел, будем их писать в первую строку */
  for($list_day = 1; $list_day <= $days_in_month; $list_day++):
    $calendar.= '<td class="calendar-day">';
      /* Пишем номер в ячейку */
      $calendar.= '<div class="day-number">'.$list_day.'</div>';

      /** ЗДЕСЬ МОЖНО СДЕЛАТЬ MySQL ЗАПРОС К БАЗЕ ДАННЫХ! ЕСЛИ НАЙДЕНО СОВПАДЕНИЕ ДАТЫ СОБЫТИЯ С ТЕКУЩЕЙ - ВЫВОДИМ! **/
      $calendar.= str_repeat('<p> </p>',2);
      
    $calendar.= '</td>';
    if($running_day == 6):
      $calendar.= '</tr>';
      if(($day_counter+1) != $days_in_month):
        $calendar.= '<tr class="calendar-row">';
      endif;
      $running_day = -1;
      $days_in_this_week = 0;
    endif;
    $days_in_this_week++; $running_day++; $day_counter++;
  endfor;

  /* Выводим пустые ячейки в конце последней недели */
  if($days_in_this_week < 8):
    for($x = 1; $x <= (8 - $days_in_this_week); $x++):
      $calendar.= '<td class="calendar-day-np"> </td>';
    endfor;
  endif;

  /* Закрываем последнюю строку */
  $calendar.= '</tr>';

  /* Закрываем таблицу */
  $calendar.= '</table>';
  
  /* Все сделано, возвращаем результат */
  return $calendar;
}

/* СПОСОБ ПРИМЕНЕНИЯ */
echo '<h2>Июнь 2012</h2>';
echo draw_calendar(6,2012);

Результат

Календарь в русском стиле на PHP

PHP скрипт календаря в английском стиле

Впринципе, незнаю зачем он вам. Но, вдруг кому-то нужен именно такой. Код практически тот же.

/* Функция генерации календаря */
function draw_calendar($month,$year){

  /* Начало таблицы */
  $calendar = '<table cellpadding="0" cellspacing="0" class="calendar">';

  /* Заглавия в таблице */
  $headings = array('Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday');

  $calendar.= '<tr class="calendar-row"><td class="calendar-day-head">'.implode('</td><td class="calendar-day-head">',$headings).'</td></tr>';

  /* необходимые переменные дней и недель... */
  $running_day = date('w',mktime(0,0,0,$month,1,$year));
  $days_in_month = date('t',mktime(0,0,0,$month,1,$year));
  $days_in_this_week = 1;
  $day_counter = 0;
  $dates_array = array();

  /* первая строка календаря */
  $calendar.= '<tr class="calendar-row">';

  /* вывод пустых ячеек в сетке календаря */
  for($x = 0; $x < $running_day; $x++):
    $calendar.= '<td class="calendar-day-np"> </td>';
    $days_in_this_week++;
  endfor;

  /* дошли до чисел, будем их писать в первую строку */
  for($list_day = 1; $list_day <= $days_in_month; $list_day++):
    $calendar.= '<td class="calendar-day">';
      /* Пишем номер в ячейку */
      $calendar.= '<div class="day-number">'.$list_day.'</div>';

      /** ЗДЕСЬ МОЖНО СДЕЛАТЬ MySQL ЗАПРОС К БАЗЕ ДАННЫХ! ЕСЛИ НАЙДЕНО СОВПАДЕНИЕ ДАТЫ СОБЫТИЯ С ТЕКУЩЕЙ - ВЫВОДИМ! **/
      $calendar.= str_repeat('<p> </p>',2);
      
    $calendar.= '</td>';
    if($running_day == 6):
      $calendar.= '</tr>';
      if(($day_counter+1) != $days_in_month):
        $calendar.= '<tr class="calendar-row">';
      endif;
      $running_day = -1;
      $days_in_this_week = 0;
    endif;
    $days_in_this_week++; $running_day++; $day_counter++;
  endfor;

  /* Выводим пустые ячейки в конце последней недели */
  if($days_in_this_week < 8):
    for($x = 1; $x <= (8 - $days_in_this_week); $x++):
      $calendar.= '<td class="calendar-day-np"> </td>';
    endfor;
  endif;

  /* Закрываем последнюю строку */
  $calendar.= '</tr>';

  /* Закрываем таблицу */
  $calendar.= '</table>';
  
  /* Все сделано, возвращаем результат */
  return $calendar;
}

/* СПОСОБ ПРИМЕНЕНИЯ */
echo '<h2>June 2012</h2>';
echo draw_calendar(6,2012);

Результат

Календарь в английском стиле на PHP

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


Демо Скачать исходники (0 Mb.)


Источник материала ...

Дальше: Проверка надежности пароля, проверяем пароль на сложность с помощью jQuery


Дискуссия по теме    30 Комментариев
Добавить комментарий
Денис 22.07.2017 ? 16:11
Подскажите как подсветить сегодняшний день в календаре?
Олег 21.11.2015 в 05:06
Если на отмеченное для вставки данных место вписать echo с текстом, то символы выводятся вне таблицы календаря. Разбираюсь.
Юрец 24.08.2015 в 11:00
Скажите, а все баги поправлены? можно смело качать и втыкать? или надо сидеть и из комментов выуживать косяки?
РУслан 09.06.2015 в 16:29
Хотелось бы увидеть пример как подключить базу SQL а то предложения которые ниже не рабочие заранее спасибо
NTs 21.04.2015 в 18:42
А есть вариант чтобы ячейки не были пустыми а заполнились днями следующего/предыдущего месяца?
Сергей 26.03.2015 в 16:24
В русском календаре ошибка. Например март 2015 отображает неверно
webd 16.04.2015 в 14:52
Если внести исправления от: Дмитрий (24.07.2013 в 02:46) Сергей (19.03.2013 в 21:25) -всё OK! То что нужно и просто. Спс!
lester 22.03.2015 в 15:23
Ну что братишка, спасибо за полезный скрипт! Очень классная штука после легкого допиливания!
PendalF 30.01.2015 в 14:01
Благодарю за скрипт!
Денис 03.12.2014 в 09:36
Сделал запрос к базе, выводит события на каждый день в календаре. Как указать, чтобы выводил в определенный день
Борис 14.10.2014 в 16:13
Календарь багнутый Вбейте июнь 2014
Борис 17.09.2014 в 03:51
Спасибо. в самом низу исправил на echo (date("F / Y ")); echo draw_calendar(date("m"), date("Y")); для отображения текущего месяца.
Павел 13.05.2014 в 15:40
Для русского стиля нужно $running_day = $running_day - 1; Заменить на if($running_day == 0){ $running_day = $running_day 6; }else{ $running_day = $running_day - 1; } Тогда один из багов решиться
Vovas 25.05.2014 в 22:52
Для русского можно исправить: $running_day = date('N',mktime(0,0,0,$month,1,$year)); for($x = 1; $x < $running_day; $x ): if($running_day == 7): Убрать: $running_day = $running_day - 1;
Cocaine 05.10.2013 в 12:34
Скажите пожалуйс хоть в двух словах лучше даже на примере /** ЗДЕСЬ МОЖНО СДЕЛАТЬ MySQL ЗАПРОС К БАЗЕ ДАННЫХ! ЕСЛИ НАЙДЕНО СОВПАДЕНИЕ ДАТЫ СОБЫТИЯ С ТЕКУЩЕЙ - ВЫВОДИМ! **/ как это работает?))
Тарас 07.10.2013 в 18:54
Вам необходимо почитать о взаимодействии php с mysql базой данных, тогда будет понятно как это сделать. В зависимости от, того как организована информация в таблицах БД. Если, таблица (events) с событиями, например: id - идентификатор записи в БД, по которому будем к ней обращатся name - имя события description - описания события date_year - год события date_month - месяц события date_day - день в месяце, для события тогда: 1. Соединяемся с БД 2. Посылаем запрос: select * from events where id = 123 3. Получаем все данные в массиве с таблицы events, для конкретной записи (события) 4. Сравниваем date_month и date_day с днями в календаре, если совпадают то выводим в <p title="описание события">имя события</p> Ну это так... в двух словах.
Тарас 07.10.2013 в 18:56
Ошибся с запросом... нужно подать такой: select * from event where date_month = 12 and date_year = 2013 тогда получим все события на 12 месяц в 2013 году с БД, в многомерном массиве.
voofka 13.09.2013 в 15:17
Спасибо! "То что доктор прописал..." ;)
Дмитрий 24.07.2013 в 02:46
/* Выводим пустые ячейки в конце последней недели */ if(($days_in_this_week < 8)and($days_in_this_week !=1)):/*чтобы не рисовал лишнюю строку, когда заканчивается воскресеньем*/
Вадим 21.07.2013 в 20:36
Когда месяц начинается с воскресенья - выводит неправильно, Декабрь 2013 Сентябрь 2013
Сергей 23.05.2014 в 01:06
Я заменил >> $running_day = $running_day - 1; на >> if ($running_day == 0){ >> $running_day = $running_day 6;} >> else { >> $running_day = $running_day - 1; >> } и ошибка исправлена
Олег 02.07.2013 в 10:39
ЗДЕСЬ МОЖНО СДЕЛАТЬ MySQL ЗАПРОС К БАЗЕ ДАННЫХ! ЕСЛИ НАЙДЕНО СОВПАДЕНИЕ ДАТЫ СОБЫТИЯ С ТЕКУЩЕЙ - ВЫВОДИМ - Напишите плиз как это сделать
Тарас 02.07.2013 в 16:19
http://sitear.ru/material/mysql-zaprosy Смотря как организованна таблица событий в базе данных. Допустим, что в таблице events, будут поля id (автоматически), date (в формте гггг-мм-дд), event_name (описание события). Тогда можно так (только перед этим не забывайте подключиться к БД): $running_date = $year.'-'.$month.'-'.$running_day; $query = mysql_query("SELECT * FROM events WHERE date = '$running_date' "); while($result = mysql_fetch_assoc($query)) { $calendar.= '<p>'.$result['event_name'].'</p>'; }
Егор 20.05.2013 в 22:18
Может кто нибудь помочь профану в ПХП вставить это чудо на сайт так, чтобы работало? Кривизна рук не позволяет этого сделать((((
Adder 14.05.2013 в 00:50
Спасибо, полезный скрипт, подогнал для администрирования брони гостиничных номеров кликом по дате.
Сергей 19.03.2013 в 21:25
Спасибо! Очень пригодился скрипт. Небольшое дополнение хотел бы предложить внести: Для версии в русскоязычном стиле строку $running_day = $running_day - 1; заменить на if($running_day == 0)$running_day = 6; else $running_day = $running_day - 1; Иначе для месяцев, у которых первое число воскресенье (напр. сентябрь 2013, декабрь 2013) календарь отрисовывается некорректно, появляется 8-й день недели. Еще раз спасибо. Удачи! :)
voofka 13.09.2013 в 15:16
Спасибо, за патч :)
Алекс 12.12.2012 в 13:16
отличный календарь, спасибо! Максим, спасибо за исправленную ошибку, помогло.
Максим 26.10.2012 в 16:51
У Вас в русском календаре ошибочка одна: после $running_day = $running_day - 1; нужно добавить строку if($running_day == -1) $running_day = 6; Можете проверить. Поставив дату echo draw_calendar(1,2012); Мой сайт: www.astbiznes.ru )))
Руслан 20.10.2012 в 13:59
спасибо)))
Добавить комментарий
Просмотров: 57329
Страхование КАСКО
карта банка
ндфл
усн
Оформление доверенности
страхование ипотеки
esim
осаго
ВЗР страхование
кредитная карта
Cialis barato Viagra Contrareembolso Cialis 5 mg precio mejores farmacias para comprar Viagra reacciones adversas de Cialis Reduslim cómo tomar soluciones para la impotencia Sildenafil Comprare Cialis 5 mg Giornaliero online in Italia Effetti indesiderati del Cialis 5 mg Acquista Cialis 20mg Cialis originale in vendita In Svizzera si compra il Viagra senza ricetta Cialis 10mg online Acquista Viagra in farmacia Offerta Cialis 5mg Spedra Avanafil in vendita online Acquista Viagra in Svizzera senza prescrizione авиатор спрайб Consegna a domicilio di Cialis 5 mg Effetti collaterali di Cialis 5 mg Consegna a domicilio di Cialis 20mg Acquista Cialis originale generico in Svizzera Consegna a domicilio di Viagra senza ricetta in Svizzera Compra Cialis 10mg Consegna a domicilio di Viagra in farmacia online Sconto Cialis 5mg Comprar Reduslim por internet Comprare Spedra Avanafil senza ricetta online Dove comprare il Viagra in Svizzera Compra Cialis Comprar online Viagra Contrareembolso Dónde encontrar Cialis 5 mg al mejor precio Viagra sin receta Cialis 5 mg efectos secundarios graves Reduslim comprar en línea Disfuncion Erectil tadalafilo avanafil prezzo cialis 20 mg prezzo cialis effetti benefici cialis 10 mg Reduslim Kaufen pulse x coin price