Назад

Битрикс фильтр по дате

Главная
Блог
Битрикс фильтр по дате

Фильтрация данных по дате — распространённая задача при разработке на Битрикс. В этой статье мы рассмотрим все аспекты работы с датами: от выбора дат через календарь до формирования сложных фильтров с учётом разных форматов данных.

Использование компонента календаря

Битрикс предоставляет удобный компонент для выбора дат, который можно интегрировать в любую форму фильтрации:

<?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');

Заключение

Правильная работа с датами в Битрикс требует внимания к форматам данных и особенностям фильтрации. Используйте приведённые примеры как основу для реализации сложных фильтров в своих проектах.

Для более глубокого изучения темы рекомендуем:

  1. Документация по работе с датами

  2. Справочник по фильтрам

Нужен надежный исполнитель?
Разрабатываем сайты, выполняем миграцию на Битрикс, дорабатываем функционал, сопровождаем проекты, а также занимаемся поисковым продвижением и комплексным маркетингом
Получить консультацию
Читайте по теме
Все статьи
Нужен надежный исполнитель?
Разрабатываем сайты, выполняем миграцию на Битрикс, дорабатываем функционал, сопровождаем проекты, а также занимаемся поисковым продвижением и комплексным маркетингом
Получить консультацию
Все статьи