Фильтрация данных по дате — распространённая задача при разработке на Битрикс. В этой статье мы рассмотрим все аспекты работы с датами: от выбора дат через календарь до формирования сложных фильтров с учётом разных форматов данных.
Использование компонента календаря
Битрикс предоставляет удобный компонент для выбора дат, который можно интегрировать в любую форму фильтрации:
<?php
$APPLICATION->IncludeComponent(
"bitrix:main.calendar",
"template1",
array(
"SHOW_INPUT" => "Y",
"FORM_NAME" => "arrFilter_form",
"INPUT_NAME" => "DATE_FROM",
"INPUT_NAME_FINISH" => "DATE_TO",
"INPUT_VALUE" => "",
"INPUT_VALUE_FINISH" => "",
"SHOW_TIME" => "N", // Y - если нужно время
"HIDE_TIMEBAR" => "Y",
"INPUT_ADDITIONAL_ATTR" => "placeholder=\"дд.мм.гггг\" class=\"form-control\""
),
false
);
?>Официальная документация компонента
Преобразование форматов дат
Перед фильтрацией важно правильно преобразовать даты из пользовательского формата в формат БД:
<?
global $arrFilter;
if (!empty($_REQUEST['DATE_FROM']) {
$dateFrom = \Bitrix\Main\Type\DateTime::createFromUserTime(
$_REQUEST['DATE_FROM'],
'd.m.Y'
)->format('Y-m-d');
}
if (!empty($_REQUEST['DATE_TO'])) {
$dateTo = \Bitrix\Main\Type\DateTime::createFromUserTime(
$_REQUEST['DATE_TO'],
'd.m.Y'
)->format('Y-m-d 23:59:59'); // Включаем весь день
}
?>Формирование фильтров
1. Фильтрация по диапазону дат
<?
if (!empty($dateFrom) && !empty($dateTo)) {
$arrFilter = [
"LOGIC" => "AND",
[">=DATE_ACTIVE_FROM" => $dateFrom],
["<=DATE_ACTIVE_TO" => $dateTo]
];
}
?>2. Фильтрация по одной дате
<?
elseif (!empty($dateFrom)) {
$arrFilter = [">=DATE_ACTIVE_FROM" => $dateFrom];
}
elseif (!empty($dateTo)) {
$arrFilter = ["<=DATE_ACTIVE_TO" => $dateTo];
}
?>Валидация введённых дат
Рекомендуется проверять корректность введённых данных:
<?
function validateDate($date, $format = 'd.m.Y') {
$d = DateTime::createFromFormat($format, $date);
return $d && $d->format($format) == $date;
}
if (!empty($_REQUEST['DATE_FROM']) && !validateDate($_REQUEST['DATE_FROM'])) {
$APPLICATION->ThrowException('Некорректная начальная дата');
}
?>Использование фильтра в компонентах
Пример с компонентом news.list:
<?php
$APPLICATION->IncludeComponent(
"bitrix:news.list",
".default",
array(
"FILTER_NAME" => "arrFilter",
"IBLOCK_TYPE" => "news",
"IBLOCK_ID" => "1",
"NEWS_COUNT" => "20",
// другие параметры
),
false
);
?>Работа с разными типами свойств
1. Стандартные поля:
$arrFilter = [">=DATE_ACTIVE_FROM" => $date];2. Свойства типа "Дата":
$arrFilter = [">=PROPERTY_DATE_VALUE" => $date];3. Множественные свойства:
$arrFilter = [
"=PROPERTY_DATES" => [
"VALUE" => $date,
"OPERATOR" => ">="
]
];Альтернативные методы работы с датами
Использование D7:
use Bitrix\Main\Type\DateTime;
$dateFilter = DateTime::createFromUserTime($_REQUEST['DATE'], 'd.m.Y');Фильтрация с учётом времени:
$dateTime = DateTime::createFromUserTime(
$_REQUEST['DATETIME'],
'd.m.Y H:i:s'
)->format('Y-m-d H:i:s');Заключение
Правильная работа с датами в Битрикс требует внимания к форматам данных и особенностям фильтрации. Используйте приведённые примеры как основу для реализации сложных фильтров в своих проектах.
Для более глубокого изучения темы рекомендуем: