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

В данной статье рассмотрим как при помощи API Битрикса фильтровать по дате в правильном формате.

Как в битриксе вызвать календарь

Для начала посмотрим компонент, который по клику на иконку выбирает дату. Зачем это нужно? Вы можете использовать его в своих фильтрах (например, добавив иконку в инпут справа):

<?
$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",
		"HIDE_TIMEBAR" => "Y",
		"INPUT_ADDITIONAL_ATTR" => "placeholder=\"дд.мм.гггг\""
	),
	false
);
?>

Такая вот возможность данной CMS :). А теперь перейдем к АПИ.

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

Если мы будем писать свои фильтры, для начала объявим глобально переменную $arrFilter, а также, $_GET[‘DATE_FROM’] и $_GET[‘DATE_TO’] перекодируем даты (которые пришли к нам с 2 input`ов сформированные компонентами календарь, для каждого свой шаблон и свой name):

<?
global $arrFilter;
if (!empty($_GET['DATE_FROM']) && !empty($_GET['DATE_TO'])) {
	$first = $DB->FormatDate($_GET['DATE_FROM'],"DD.MM.YYYY HH:MI:SS", "YYYY-MM-DD HH:MI:SS");
	$last = $DB->FormatDate($_GET['DATE_TO'],"DD.MM.YYYY HH:MI:SS", "YYYY-MM-DD HH:MI:SS");
}

Обратите внимание на DB->FormatDate. Он позволяет нам перевести дату в тот формат, по которой ее можно отфильтровать. Сразу же в этом блоке добавим массив, используя логику «И»:

<?
global $arrFilter;
if (!empty($_GET['DATE_FROM']) && !empty($_GET['DATE_TO'])) {
	$first = $DB->FormatDate($_GET['DATE_FROM'],"DD.MM.YYYY HH:MI:SS", "YYYY-MM-DD HH:MI:SS");
	$last = $DB->FormatDate($_GET['DATE_TO'],"DD.MM.YYYY HH:MI:SS", "YYYY-MM-DD HH:MI:SS");
	$arrFilter = array(
		"LOGIC" => "AND",
		array(">=PROPERTY_UF_DATE" => $first),
		array("<=PROPERTY_UF_DATE" => $last),
	);
}

Допишем случаи, когда доступна только одна дата:

<?
global $arrFilter;
if (!empty($_GET['DATE_FROM']) && !empty($_GET['DATE_TO'])) {
	$first = $DB->FormatDate($_GET['DATE_FROM'],"DD.MM.YYYY HH:MI:SS", "YYYY-MM-DD HH:MI:SS");
	$last = $DB->FormatDate($_GET['DATE_TO'],"DD.MM.YYYY HH:MI:SS", "YYYY-MM-DD HH:MI:SS");
	$arrFilter = array(
		"LOGIC" => "AND",
		array(">=PROPERTY_UF_DATE" => $first),
		array("<=PROPERTY_UF_DATE" => $last),
	);
}
elseif(!empty($_GET['DATE_FROM'])) {
	$date = $DB->FormatDate($_GET['DATE_FROM'],"DD.MM.YYYY HH:MI:SS", "YYYY-MM-DD HH:MI:SS");
	$arrFilter[] = array(">=PROPERTY_UF_DATE" => $date);
}
elseif(!empty($_GET['DATE_TO'])) {
	$date = $DB->FormatDate($_GET['DATE_TO'],"DD.MM.YYYY HH:MI:SS", "YYYY-MM-DD HH:MI:SS");
	$arrFilter[] = array("<=PROPERTY_UF_DATE" => $date);
}
?>

Помните, если по дате не удается отфильтровать, то причина в неправильном формате, и тут уже на помощь приходит $DB->FormatDate. Таков уж Битрикс 🙂

Напоминаю что на этом сайте есть статья про фильтрацию по году:

Как отфильтровать новости по годам в 1С-Битрикс

автор: Dmitriy

Занимаюсь веб-разработкой с 2011 года. Посмотреть некоторые из моих работ, а также узнать чуть больше обо мне, вы можете на forwww.ru.

2 комментария

  1. Здравствуйте Дмитрий, есть вопрос по использованию этого фильтра, можете написать мне на почту, там переговорим.

Добавить комментарий для Dmitriy Отменить ответ

Ваш адрес email не будет опубликован. Обязательные поля помечены *