Начнем с установки нескольких переменных среды. Очевидно, что нам необходимо знать URL нашего скрипта, и, поскольку мы работаем с календарем, нам нужна дата, от которой мы будем отталкиваться. Нам нужно проверить, указывает ли назначенная на наш URL переменная на конкретный год, месяц и день. Если нет, то мы начнем с сегодняшней даты.
<?php // местоположение скрипта $self = $_SERVER['PHP_SELF']; // проверяем, если в переменная month была установлена в URL-адресе, //либо используем PHP функцию date(), чтобы установить текущий месяц. $month = $_GET['month']; $month = $_GET['viewmonth']; // Теперь мы проверим, если переменная года устанавливается в URL, //либо использовать PHP функцию date(), //чтобы установить текущий год, если текущий год не установлен в URL-адресе. $year = $_GET['year']; $year = $_GET['viewyear']; ?>
Следующая задача будем немного сложнее, чем кажется, когда мы впишем ее в код. Мне нужно было изменить год, когда наступал следующий за декабрем месяц. Позже вы увидите, что то же самое нужно будет делать и на тот случай, если календарь будет просматриваться в обратную сторону.
<?php if($month == '12') $next_year = $year + 1; else $next_year = $year; ?>
Теперь давайте используем установленные выше значения месяца и года, чтобы выяснить, на какой день выпадет начало нового месяца. К счастью, mktime идеально подойдет для этой задачи. Если кто не знает, в mktime передаются следующие значения: Час, Минута, Секунда, Месяц, День и Год. Затем он выдает временную метку Unix для этого момента времени.
<?php "1" => "январь", "2" => "февраль", "3" => "март", "4" => "апрель", "5" => "май", "6" => "июнь", "7" => "июль", "8" => "август", "9" => "сентябрь", "10" => "октябрь", "11" => "ноябрь", "12" => "декабрь"); // Массив имен всех дней в неделю 'Wednesday', 'Thursday', 'Friday', 'Saturday'); $month = $date_info['mon']; $year = $date_info['year']; // Если текущий месяц это январь, //и мы пролистываем календарь задом наперед число, //обозначающее год, должно уменьшаться на один. if($month == '1'): $last_year = $year-1; else: $last_year = $year; endif; // Вычитаем один день с первого дня месяца, //чтобы получить в конец прошлого месяца $timestamp_last_month = $first_of_month - (24*60*60); // Проверяем, что если месяц декабрь, //на следующий месяц равен 1, а не 13 if($month == '12') $next_month = '1'; else $next_month = $month+1; ?>
Как видите, мы потратили достаточно много времени на то, чтобы убедиться, что мы знаем наше положение во времени и можем влиять на то, что произойдет, когда значения дней, лет и месяцев будут уменьшаться или увеличиваться при просмотре календаря. Важно помнить, что при работе с датами всегда полезно устанавливать значения по умолчанию, прежде чем приступать к созданию кода. Нельзя точно знать, что вам понадобиться, но по ходу выполнения задачи вам почти наверняка нужно будет узнать текущий день, месяц и год. Мы снова используем функцию даты() в PHP и mktime(), чтобы точно манипулировать числами. Далее мы начинаем чертить календарь.
<?php $calendar = " <div class=\"block-on-center\"> <table width='390px' height='280px' style='border: 1px solid #cccccc';> <tr style='background: #5C8EB3;'> <td colspan='7' class='navi'> <a style='margin-right: 50px; color: #ffffff;' href='$self?month=".$last_month."&year=".$last_year."'><<</a> ".$Month_r[$month]." ".$year." <a style='margin-left: 50px; color: #ffffff;' href='$self?month=".$next_month."&year=".$next_year."'>>></a> </td> </tr> <tr> <td class='datehead'>Пн</td> <td class='datehead'>Вт</td> <td class='datehead'>Ср</td> <td class='datehead'>Чт</td> <td class='datehead'>Пт</td> <td class='datehead'>Сб</td> <td class='datehead'>Вс</td> </tr> <tr>"; ?>
Выше мы сделали заголовок таблицы и ссылки навигации, чтобы переходить вперед и назад по месяцам и годам в календаре. Теперь мы печатаем дни, выделяя сегодняшнюю дату. Каждый день – это ссылка на тот день, на который мы можем перейти. Теперь будет просто создать систему событий, так как день, месяц и год, на которые вы кликаете, указывает на URL, благодаря чему вы можете просматривать установки и показывать события согласно этому.
<?php // очищаем имя класса css $class = ""; $weekday = $date_info['wday']; // Приводим к числа к формату 1 - понедельник, ..., 6 - суббота $weekday = $weekday-1; if($weekday == -1) $weekday=6; // станавливаем текущий день как единица 1 $day = 1; // выводим ширину календаря if($weekday > 0) $calendar .= "<td colspan='$weekday'> </td>"; while($day <= $maxdays) { // если суббота, выволдим новую колонку. if($weekday == 7) { $calendar .= "</tr><tr>"; $weekday = 0; } // проверяем, если распечатанная дата является сегодняшней датой. //если так, используем другой класс css, чтобы выделить её $class = "caltoday"; //в противном случае, печатаем только ссылку на вкладку else { $class = "cal"; } //помечаем выходные дни красным if($weekday == 5 || $weekday == 6) $red='style="color: red" '; else $red=''; $calendar .= " <td class='{$class}'><span ".$red.">{$day}</span> </td>"; $day++; $weekday++; } if($weekday != 7) $calendar .= "<td colspan='" . (7 - $weekday) . "'> </td>"; // выводим сам календарь echo $calendar . "</tr></table>"; ?>
Хотите - верьте, хотите – нет, но на этом все. Теперь можно кликать на каждый день календаря, переходить на месяцы и годы, нажимая на стрелки рядом с названием месяца в заголовке таблицы. Сегодняшняя дата отличается от всех остальных своим классом CSS, поэтому ее можно стилизовать по своему усмотрению, и у нас получился довольно гибкий календарь. В завершение хочу включить в наш проект небольшую форму, которая позволит вам переходить на любой месяц любого года на двадцать лет вперед. Также хочу предложить ссылку для перехода на текущий месяц. Код очень простой:
<?php 'Январь', 'Февраль', 'Март', 'Апрель', 'Май', 'Июнь', 'Июль', 'Август', 'Сентябрь', 'Октябрь', 'Ноябрь', 'Декабрь'); echo "<form style='float: right; margin-right: 10px;' action='$self' method='get'> <select name='month'>"; for($i=0; $i<=11; $i++) { echo "<option value='".($i+1)."'"; if($month == $i+1) echo "selected = 'selected'"; echo ">".$months[$i]."</option>"; } echo "</select>"; echo "<select name='year'>"; { $selected = ($year == $i ? "selected = 'selected'" : ''); echo "<option value=\"".($i)."\"$selected>".$i."</option>"; } echo "</select><input type='submit' value='смотреть' /></form>"; echo "<a style='float: left; margin-left: 10px; font-size: 12px; padding-top: 5px;' echo "</div>"; ?>
