Поскольку функция рисования каландра равна
function draw_calendar($month,$year){
Вы должны указать $month
и $year
в следующих / предыдущих ссылках, например,
/calendar.php?month=12&year=2011
Эти данные становятся доступны в $_GET
при нажатии на такую ссылку. Вам не нужны неанизированные данные, поэтому вы получаете их в верхней части скрипта календаря:
$input = filter_input_array(
INPUT_GET,
array(
'month' => array(
'filter' => FILTER_VALIDATE_INT,
'options' => array('min_range' => 1, 'max_range' => 12)
),
'year' => array(
'filter' => FILTER_VALIDATE_INT,
'options' => array('min_range' => 2010, 'max_range' => 2015)
)
)
);
Функция фильтра гарантирует, что мы получим месяц между 1 и 12 и год между 2010 и 2015 годами (скорректируйте соответственно или удалите параметры по своему усмотрению). Если переданные числа не находятся в этом диапазоне (или ни одна ссылка еще не была нажата), мы получим false
для них, что означает, что мы должны будем установить нормальные значения по умолчанию, например
$input['year'] = $input['year'] ?: date('Y');
$input['month'] = $input['month'] ?: date('n');
При этом будут использоваться допустимые значения, переданные сценарию, или, в случае недопустимых значений, установить год и / или месяц на текущий год и / или месяц.
Теперь нарисуйте календарь:
echo draw_calendar($input['month'], $input['year']);
Для следующей / предыдущей ссылки вы можете либо вручную проверить, равен ли месяц 12 или 1, а затем соответственно увеличить / уменьшить год или использовать DateTime
объект
$dateTime = new DateTime;
$dateTime->setDate($input['year'], $input['month'], 1));
printf(
'<a href="/calendar.php?month=%d&year=%d">Next</a>' .
'<a href="/calendar.php?month=%d&year=%d">Previous</a>',
$dateTime->modify('-1 month')->format('n'),
$dateTime->format('Y'),
$dateTime->modify('+2 month')->format('n'),
$dateTime->format('Y')
);
демо (слегка сокращенное)
Другой вариант - сохранить текущий месяц и год в сеансе, а затем просто иметь следующие / предыдущие ссылки без года и месяца, а просто что-то вроде +1 и -1 для перехода назад и вперед. Но тогда у вас нет прямого способа перейти к определенному месяцу.
И это все, что нужно.