Недавно изрядно пришлось повозиться, казалось бы, пустяковой задачей: реализовать фильтр новостей по годам. Плюс, если запись старее от последнего года то выводить их как архив. Почесав бороду и яйца ринулся кодить. Брал текущий год и последние 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>
Спасибо! Все прям чотко!)
ОтветитьУдалить