Pers.narod.ru. PHP. Ввод и обработка диапазона дат на PHP с помощью JQuery.DatePicker

Часто на самых разных сайтах нам нужно ввести диапазон дат, который может обозначать всё, что угодно, например, дни запланированного туристического похода, период очередного отпуска или даты начала и окончания семестра в учебном заведении.

При этом, "ручной" ввод дат нежелателен - высока вероятность, что пользователь или редактор сайта просто ошибутся при наборе всех этих точек и чёрточек. Да и представлений о том, как вводить дату, существует не меньше, чем форматов даты, принятых в разных странах. Поэтому очень желательно иметь компоненту, которая, во-первых, позволит ввести две даты с помощью удобного всплывающего календаря, во-вторых, не даст "испортить" их вручную, в-третьих, результат ввода можно будет потом легко сохранить в базе данных в формате, не зависящем от региональных настроек.

Разумеется, сегодня никто уже не программирует эту задачу "с нуля" (хотя вот тут я некогда делал) - есть же библиотека JQuery со множеством расширений, в которых всё уже запрограммировано. В частности, расширение DatePicker делает как раз то, что нам нужно.

К сожалению, с версии JQuery 1.7 удобная возможность ввода диапазона дат из DatePicker'а исключена (разработчики обещают вернуть её в будущем), так что используем для примера jquery-1.6.2.min.js, в котором тоже есть всё необходимое. Из всего огромного количества компонент библиотеки JQuery UI (User Interface) нам понадобится только файл ui.datepicker.min.js, а для русификации нашего DаtePicker'а используем файлик jquery-ui-i18n.js. Стилевые настройки содержит файл ui.datepicker.css, расположенный в папке css.

<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
<link type="text/css" href="css/ui.datepicker.css" rel="stylesheet">
<script src="js/jquery-1.6.2.min.js" type="text/javascript"></script>
<script src="js/ui.datepicker.min.js" type="text/javascript"></script>
<script src="js/jquery-ui-i18n.js" type="text/javascript"></script>

Всё вместе это почти 150 Кб кода, но что делать - такова плата за красоту и удобство. Да и не так велик подобный траффик в наше время.

Это ещё не весь Javascript-код, что нам придётся включить на страничку. Небольшой скрипт, расположенный после загрузки библиотек, занимается настройкой нашего DatePicker'а:

<script type="text/javascript">
$(function(){
  $.datepicker.setDefaults(
   $.extend($.datepicker.regional["ru"])
  );
  $("#datepicker").datepicker({
    rangeSelect: true,
    minDate: "-1y",
    maxDate: "+1y",
    changeMonth: true,
    changeYear: true,
    dateFormat: "dd.mm.yy",
    defaultDate: null
  });
});
</script>

Здесь разрешается ввод диапазона дат (повторим, что работает это только в версиях JQuery младше 1.7), минимальная и максимальная разрешённые даты ставятся на год назад и вперёд от текущей, разрешается вывод списков для смены месяца и года, выставляется формат даты ДД.ММ.ГГГГ (например, 21.12.2011) и датой по умолчанию ставится сегодняшняя.

Теперь нам осталось "нарисовать" форму HTML, содержащуюю текстовое поле ввода даты, скрипт "узнает" его по атрибуту id="datepicker".

<form method="post">
<input id="datepicker" type="text" name="date12" size="23" maxlength="23" value="">
</form>

Вот что получилось (щёлкните по полю и увидите, если мой сайт не лежит :)

 

 

Пример был бы неполон и не относился бы к разделу PHP, если бы мы не сказали несколько слов о том, как сохранять полученные даты в базе данных MySQL и наоборот получать ранее сохранённые даты для вывода в DatePicker.

Поскольку на PHP я предпочитаю всегда хранить дату как целое bigint, код будет предназначен для таких случаев, нужные комментарии даны прямо в тексте. Предполагается, что поле формы называется date12, как и в тексте выше.

//Пример кода для получения данных в datepicker из полей БД
//date1 и date2 (начало и конец периода) типа bigint
$sql='select * from ТАБЛИЦА where id="'.$id.'"';
$result = mysql_query($sql);
if (!$result or !mysql_num_rows($result)) {
 // Обработка ошибки
 return;
}
$note = mysql_fetch_assoc ($result);
//Если получена дата из базы - преобразовать в формат поля,
//иначе взять за начало периода текущую дату, за конец - завтрашнюю
if ($note['date1']) $date1=get_int_date($note['date1']);
else $date1=get_int_date(time());
if ($note['date2']) $date2=get_int_date($note['date2']);
else $date2=get_int_date(time()+86400);
//Получить дату для вывода в datepicker
$date12=$date1.'-'.$date2;
//Вывести форму с заполненной датой
 echo '<div align="center">
  <form method="post">
  <input id="datepicker" type="text" name="date12" class="button" size="23" maxlength="23" value="'.$date12.'">
  </form>';
 
//Код функции get_int_date:
function get_int_date ($d) { //Получить дату из bigint
 return @date("d.m.Y", $d);
}
 
 
 
 
//Пример кода для сохранения данных, введённых в datepicer,
//в полях базы с именами date1 и date2 (начало и конец периода) типа bigint
$date12=htmlspecialchars(trim($_POST['date12']));
list ($date1,$date2) = @split ('-', $date12);
$date1=get_field_date(trim($date1));
$date2=get_field_date(trim($date2));
//Переменная $id содержит идентификатор нужной записи
$sql='update ТАБЛИЦА set date1 = "'.$date1.'", date2 = "'.$date2.'" where id = "'.$id.'"';
$result = mysql_query ($sql);
if (!$result) {
 // Обработка ошибки 
}
 
//Код функции get_field_date:
function get_field_date ($date1) { //Получть дату из поля ввода
 $errorlevel = ini_get ('error_reporting');
 error_reporting (0);
 list ($d,$mon,$y) = @split ("\.", $date1);
 $date1 = mktime (0,0,0,$mon,$d,$y);
 error_reporting ($errorlevel);
 return $date1;
}

 Скачать пример в архиве ZIP (48 Кб)

Рейтинг@Mail.ru

вверх гостевая; E-mail
Hosted by uCoz