Программа: Календарь

Функция pc_calendar(), выводит календарь на месяц, подобно UNIX-функции cal. Пример:

// печать календаря для текущего месяца
list($month,$year) = explode(',',date('m,Y'));
pc_calendar($month,$year);

Функция pc_calendar() выводит таблицу, содержащую календарь на месяц. Календарь содержит ссылки на предыдущий и последующий месяцы и выделяет текущий день.

function pc_calendar($month,$year,$opts = '') {
// установка опций по умолчанию //
if (! is_array($opts)) { $opts = array(); }
if (! isset($opts['today_color'])) { $opts['today_color'] = '#FFFF00'; }
if (! isset($opts['month_link'])) {
$opts['month_link'] =
'(a href="'.$_SERVER['PHP_SELF'].'?month=%d&year=%d">%s(/a)';
}
list($this_month,$this_year,$this_day) = split(',',strftime('%m,%Y,%d'));
$day_highlight = (($this_month == $month) && ($this_year == $year));
list($prev_month,$prev_year) =
split(',',strftime('%m,%Y',mktime(0,0,0,$month-1,1,$year)));
$prev_month_link = sprintf($opts['month_link'],
$prev_month,$prev_year,'<');
list($next_month,$next_year) =
split(',',strftime('%m,%Y',mktime(0,0,0,$month+1,1,$year)));
$next_month_link = sprintf($opts['month_link'],
$next_month,$next_year,'>');
?>

$totaldays = date('t',mktime(0,0,0,$month,1,$year));
// выводим дни недели
print '';
$weekdays = array('Su','Mo','Tu','We','Th','Fr','Sa');
while (list($k,$v) = each($weekdays)) {
print '';
}
print '';
// выравниваем первый день месяца по соответствующему дню недели
$day_offset = date("w",mktime(0, 0, 0, $month, 1, $year));
if ($day_offset > 0) {
for ($i = 0; $i < $day_offset; $i++) { print ''; }
}
$yesterday = time() - 86400;
// выводим дни
for ($day = 1; $day <= $totaldays; $day++) {
$day_secs = mktime(0,0,0,$month,$day,$year);
if ($day_secs >= $yesterday) {
if ($day_highlight && ($day == $this_day)) {
print sprintf('',
$opts['today_color'],$day);
} else {
print sprintf('',$day);
}
} else {
print sprintf('',$day);
}
$day_offset++;
// начинаем новую строку каждую неделю //
if ($day_offset == 7) {
$day_offset = 0;
print "\n";
if ($day < $totaldays) { print ''; }
}
}
// заполнение последней недели пробелами //
if ($day_offset > 0) { $day_offset = 7 - $day_offset; }
if ($day_offset > 0) {
for ($i = 0; $i < $day_offset; $i++) { print ''; }
}
print '



'.$v.'
 %d%d%d
 
';
}
?>

Функция pc_calendar() начинает работу с проверки параметров, переданных ей в переменной $opts.


Цвет, которым выделяется текущий день, можно передать в виде RGB-значения через переменную $opts['today_color']. Значение по умолчанию равно #FFFF00, это ярко-желтый цвет. Кроме того, чтобы изменить вид вывода ссылок на предыдущий и последующий месяцы, можно передать строку форматирования в стиле функции printf() через переменную $opts['month_link']. Затем функция устанавливает значение переменной $day_highlight в true, если месяц и год календаря совпадают с текущими месяцем и годом. Ссылки на предыдущий и последующий месяцы помещаются в переменные $prev_month_link и $next_month_link с помощью строки форматирования, находящейся в переменной $opts['month_link']. После этого функция pc_calendar() выводит верхнюю часть HTML-таблицы, которая содержит календарь, и строку таблицы с сокращенными названиями дней недели.

С учетом дня недели, возвращенного функцией strftime('%w'), печатаются пустые ячейки таблицы, чтобы первый день месяца был выровнен по соответствующему дню недели. Например, если первый день месяца вторник, то надо напечатать две пустые ячейки, чтобы занять места, отведенные под воскресенье и понедельник в первой строке таблицы. После вывода этой предварительной информации функция pc_calendar() выполняет цикл по всем дням месяца.


Для большинства дней она печатает обычные ячейки таблицы, а для текущего дня печатает ячейку с другим цветом фона. Когда значение переменной $day_offset достигает 7, то неделя заполнена, и надо начинать новую строку таблицы. После вывода ячеек таблицы для каждого дня месяца добавляются пустые ячейки, чтобы заполнить до конца последнюю строку таблицы. Например, если последний день месяца четверг, то добавляются две ячейки, чтобы занять пространство, отведенное под пятницу и субботу. Наконец, таблица закрывается, и календарь полностью готов..



Оцените статью: (0 голосов)
0 5 0

Статьи из раздела PHP на эту тему:
Вывод на печать даты и времени в определенном формате
Выделение дат и времен из строк
Выработка высокоточного времени
Определение дня недели, месяца, года или номера недели в году
Определение разности между датами юлианского календаря

Вернуться в раздел: PHP / 3. Дата и время