Недавно изрядно пришлось повозиться, казалось бы, пустяковой задачей: реализовать фильтр новостей по годам. Плюс, если запись старее от последнего года то выводить их как архив. Почесав бороду и яйца ринулся кодить. Брал текущий год и последние 4 года и по ним формировал логику и фильтр. Но тимлид сказал что это не катит, нужно формировать года из имеющихся записей. Сбесил меня он конечно конкретно, но он был прав. Думал думал думал да придумал.
Решил прямым запросом в БД получить года. Делов то.
//Группирует записи по годам $strSql = "SELECT date_format(ACTIVE_FROM, '%Y') FROM b_iblock_element WHERE IBLOCK_ID=".$arParams["IBLOCK_ID"]." GROUP BY YEAR(ACTIVE_FROM)";
Но тот завопил - нельзя обращаться напрямую в БД, есть же ОРМ... Сказано сделано: В итоге получилось вот это:
//ORM D7
$query = new \Bitrix\Main\Entity\Query(Bitrix\Iblock\ElementTable::getEntity());
$query->registerRuntimeField(
"YEAR",
array(
"data_type" => "Datetime",
"expression" => array("LEFT(ACTIVE_FROM,4)", "ACTIVE_FROM")
))
->setSelect(array('YEAR'))
->setFilter(array("IBLOCK_ID" => $arParams["IBLOCK_ID"],'ACTIVE'=>'Y','!ACTIVE_FROM'=>''))
->setOrder(array("YEAR" => "DESC"))
->setGroup(array("YEAR"))
->setLimit(5);
$db = $query->exec();
$arrYears = $db->fetchAll();
//Выбранная дата для фильтра
$selectDate = $_REQUEST['year']?$_REQUEST['year']:date('Y');
global $dateFIlter;
// если есть папрметр архив, то берем все новости страше 5 лет
if(isset($_REQUEST['archive'])){
$selectDate = 0;
$y = end($arrYears);
$dateFIlter = Array( "<=DATE_ACTIVE_FROM" => "01.01.".$y['YEAR']);
}else {
$dateFIlter = Array(">=DATE_ACTIVE_FROM" => "01.01.".$selectDate, "<=DATE_ACTIVE_FROM" => "31.12.".$selectDate);
}
/*
Дальше идет компонент, указываем ему название фильтра
"bitrix:news.list"
"FILTER_NAME" => 'dateFIlter',
*/
На всякий случай шаблон фильтра:
<div class="tabs"> <? foreach($arrYears as $y){?> <a href="/about/news/?year=" class="tabs__item "> <?=$y['YEAR']?> </a> <?}?> <a href="/about/news/?archive" class="tabs__item ">архив</a> </div>

Спасибо! Все прям чотко!)
ОтветитьУдалить