Календарь на текущий месяц

Цель - используя PHP вывести календарь на текущий месяц. Это минимальный костяк. Дальше его можно дорабатывать, разукрашивать и переделывать под свои нужды.

Скопировано
<?php
$mos = [ 'Январь', 'Февраль', 'Март', 'Апрель', 'Май', 'Июнь', 'Июль', 'Август', 'Сентябрь', 'Октябрь', 'Ноябрь', 'Декабрь' ];
echo '<h2>' . $mos[date('n')-1] . ' ' . date( 'Y' ) . '</h2>'; ?>

<table>
	<tr>
		<th>Пн</th>
		<th>Вт</th>
		<th>Ср</th>
		<th>Чт</th>
		<th>Пт</th>
		<th>Сб</th>
		<th>Вс</th>
	</tr> <?
	$today = date( 'd' ); 	// Текущий день
	$month = date( 'm' ); 	// Текущий месяц
	$year = date( 'Y' ); 	// Текущий год
	$days = cal_days_in_month( CAL_GREGORIAN, $month, $year );  // Дней в текущем месяце
	$lastmonth = date( 't', mktime( 0, 0 , 0, $month-1, 1, $year ) );  // Дней в предыдущем месяце
	$start = date( 'N', mktime( 0, 0 , 0, $month, 1, $year ) );  // Позиция первого дня текущего месяца
	$finish = date( 'N', mktime( 0, 0, 0, $month, $days, $year ) );  // Позиция последнего дня текущего месяца
	$laststart = $start - 1;  // Дней от предыдущего месяца в календаре
	
	$counter = 1;
	$nextMonthCounter = 1;
	$rows = $start > 5 ? 6 : 5;

	for( $i = 1; $i <= $rows; $i++ ) {
		echo '<tr class="week">';
		for( $x = 1; $x <= 7; $x++ ) {
			$class = '';
			if( ( $counter - $start ) < 0 ) {
				$date = ( ( $lastmonth - $laststart ) + $counter );
				$class = 'class="blur"';
			}
			elseif( ( $counter - $start ) >= $days ) {
				$date = $nextMonthCounter;
				$nextMonthCounter++;
				$class = 'class="blur"';
			}
			else {
				$date = ( $counter - $start + 1 );
				if( $today == $counter - $start + 1 ) {
					$class = 'class="today"';
				}
			}
			echo "<td $class><a class='date'>$date</a></td>";
			$counter++;
		}
		echo '</tr>';
	} ?>
</table>
Показать код
Скопировано
.blur {
	background: #eee;
}
.today {
	border: 1px solid red;
}
Показать код