Войти Регистрация

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


Дискуссия по теме    19 Комментариев
Добавить комментарий
Борис 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
спасибо)))
Добавить комментарий
Просмотров: 21460