В данной статье рассмотрим как при помощи 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. Таков уж Битрикс 🙂
Напоминаю что на этом сайте есть статья про фильтрацию по году:
Здравствуйте Дмитрий, есть вопрос по использованию этого фильтра, можете написать мне на почту, там переговорим.
Ответил вам