линия

Главная

пятница, 20 октября 2017 г.

Bitrix: как вывести год записей инфоблока


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

1 комментарий: