1c-bitrix / bitrix api / php · 09.11.2011

Проверка активности элемента по дате [bitrix api]

В методе CIBlockElement::GetList() есть параметр фильтра для выборки активных элементов по дате. Т.е. проверка происходит еще в запросе и не надо в списке нечего проверять дополнительно.

Если вам нужно обратная сторона действия с фильтрацией по дате активности, то у вас это не получится сделать. Мной ожидалось поведение, что если
заменить Y на N то выборка отдаст только не активные по дате элементы, но к сожалению это не так, читаем еще раз док и убеждаемся в этом.

ACTIVE_DATE — непустое значение задействует фильтр по датам активности.
Будут выбраны активные по датам элементы.Если значение не установлено («»), фильтрация по датам активности не производится;

Приходится делать полную выборку и проверят уже в результате что конечно не очень хорошо.

function __isElelementDateActive($s_DateFrom, $s_DateTo)
{
    $stmp_DateFrom = MakeTimeStamp($s_DateFrom, "DD.MM.YYYY HH:MI:SS");
    $stmp_DateTo   = MakeTimeStamp($s_DateTo, "DD.MM.YYYY HH:MI:SS");
    $stmp_Date     = MakeTimeStamp(date('d.m.Y H:i:s'), "DD.MM.YYYY HH:MI:SS");

    return ($stmp_Date > $stmp_DateFrom && $stmp_Date < $stmp_DateTo);
}
+ бонус, проверка если дата истекает за 1 день
function __isOneDayShowElement($s_DateTo)
{
    $stmp_DateTo   = MakeTimeStamp($s_DateTo, "DD.MM.YYYY");
    $stmp_Date     = MakeTimeStamp(date('d.m.Y'), "DD.MM.YYYY");

    return (($stmp_DateTo - $stmp_Date) == 86400);
}
+ дата и время

function isDateTimeActive($date_from, $date_to)
{
    $ar_From    	= explode(' ', $date_from);
    $ar_DateFrom    = explode('.', $ar_From[0]);
    $ar_TimeFrom    = explode(':', $ar_From[1]);

    $ar_To      	= explode(' ', $date_to);
    $ar_DateTo    	= explode('.', $ar_To[0]);
    $ar_TimeTo    	= explode(':', $ar_To[1]);

    $ar_Date        = explode('.', date('d.m.Y'));
    $ar_Time        = explode(':', date('H:i:s'));

    $s_MetaDateFrom = mktime($ar_TimeFrom[0], $ar_TimeFrom[1], $ar_TimeFrom[2], $ar_DateFrom[1], $ar_DateFrom[0], $ar_DateFrom[2]);
    $s_MetaDateTo   = mktime($ar_TimeTo[0],   $ar_TimeTo[1],   $ar_TimeTo[2],   $ar_DateTo[1],   $ar_DateTo[0],   $ar_DateTo[2]);
    $s_MetaDate     = mktime($ar_Time[0],     $ar_Time[1],     $ar_Time[2],     $ar_Date[1],     $ar_Date[0],     $ar_Date[2]);

    return ($s_MetaDate >= $s_MetaDateFrom && $s_MetaDate <= $s_MetaDateTo);
}