Фильтр для списка элементов по Месяцу / Году

Фильтр для списка элементов по месяцу/году в комплексном компоненте news.php.
Вывод месяцев (в 2 вариантах) и выпадающего списка с годами:

$month = array('01' => "Январь", '02' => "Февраль", '03'=> 'Март' , '04'=> 'Апрель' , '05'=> 'Май', '06'=> 'Июнь' , '07'=> 'Июль', '08' => 'Август' , '09' => 'Сентябрь' , 10 => 'Октябрь' , 11 => 'Ноябрь' , 12 => 'Декабрь' );

use Bitrix\Main\Loader;
Loader::includeModule("iblock");
$arSelect = Array("ID", "IBLOCK_ID", "NAME", "DATE_ACTIVE_FROM");//IBLOCK_ID и ID обязательно должны быть указаны, см. описание arSelectFields выше
$arFilter = Array("IBLOCK_ID"=>$arParams["IBLOCK_ID"], "ACTIVE_DATE"=>"Y", "ACTIVE"=>"Y");
$res = CIBlockElement::GetList(Array("DATE_ACTIVE_FROM"=>'ASC'), $arFilter, false, Array("nPageSize"=>50), $arSelect);
echo '<p>Выводятся все месяцы с количеством элементов в скобках </p>';
echo '<ul>';
$array = array();
$monthYears = array();
$years = array();
for($i = 1; $i<=12; $i++){
while($ob = $res->GetNextElement()){
$arFields = $ob->GetFields();
if ($arr = ParseDateTime($arFields['DATE_ACTIVE_FROM'], "DD.MM.YYYY HH:MI:SS"))
{
if($arr["YYYY"] == $_GET['year']) {
$array[] = $arr["MM"];
} elseif(empty($_GET['year']) || $_GET['year'] == "all") {
$array[] = $arr["MM"];
}
if($arr["MM"] == $_GET['month']){
$monthYears[] = $arr["YYYY"];
}
$years[] = $arr["YYYY"];
$resultYears = array_count_values($years);
$result = array_count_values($array);
$resultMYear = array_count_values($monthYears);
}
}?>
<li>
<a href="?month=<?=sprintf("%02d", $i)?>&year=<?if(!empty($_GET['year'])){echo $_GET['year'];}else{echo 'all';}?>&clear_cache=Y" class="filter<?if($_GET['month'] == sprintf("%02d", $i)){?> filter-active<?}?>">
<?=$month[sprintf("%02d", $i)];?><?if($result[sprintf("%02d", $i)]){echo ' ('.$result[sprintf("%02d", $i)].')';}?>
</a>
</li>
<?}?>
<p>Выводятся месяцы, для которых существуют элементы </p>
<?foreach ($result as $key=>$resultMonth):?>
<li>
<a href="?month=<?=$key?>&year=<?if(!empty($_GET['year'])){echo $_GET['year'];}else{echo 'all';}?>&clear_cache=Y" class="filter<?if($_GET['month'] == $key){?> filter-active<?}?>">
<?=$month[$key];?><?echo ' ('.$resultMonth.')';?>
</a>
</li>
<?endforeach;?>
<?echo '</ul>';
?>
<p>Выводятся только те годы, для которых существуют элементы</p>
<select id="years" onChange="formHandler()">
<option value="?day=all&clear_cache=Y">Все</option>
<?foreach ($resultYears as $key=>$resultYear):?>
<option value="?month=<?=$_GET['month']?>&year=<?=$key?>&clear_cache=Y"<?php if ($_GET['year'] == $key) echo ' selected="selected"'; ?>><?=$key?></option>
<?endforeach;?>
</select>
Сложный фильтр для обработки результата:

<?if (!empty($_GET['year'] || $_GET['month'])) { //проверяем есть ли у нас в строке GET переменная year или month
global $arrFilter; //глобальная переменная фильтра
if(!empty($_GET['month'])) {
$monthStart = $_GET['month'];
$monthEnd = $_GET['month'];
} else {
$monthStart = '01';
$monthEnd = '12';
}
if($monthStart == '02') {
$start = '01.'.$monthStart.'.'.$_GET['year']; //начало года
$end = '29.'.$monthEnd.'.'.$_GET['year']; //конец года
} else {
$start = '01.' . $monthStart . '.' . $_GET['year']; //начало года
$end = '31.' . $monthEnd . '.' . $_GET['year']; //конец года
}

if($_GET['year'] == 'all'){
$arrFilter[0]["LOGIC"] ="OR";
foreach ($resultMYear as $key=>$year){
if($monthStart == '02') {
$arrFilter[0][] = array(
"LOGIC" => "AND",
">=DATE_ACTIVE_FROM" => '01.' . $monthStart . '.' . $key,
"<=DATE_ACTIVE_FROM" => '29.' . $monthEnd . '.' . $key
);
} else {
$arrFilter[0][] = array(
"LOGIC" => "AND",
">=DATE_ACTIVE_FROM" => '01.' . $monthStart . '.' . $key,
"<=DATE_ACTIVE_FROM" => '31.' . $monthEnd . '.' . $key
);
}
}
} else {
$arrFilter = array(
"LOGIC" => "AND",
array(">=DATE_ACTIVE_FROM" => $start),
array("<=DATE_ACTIVE_FROM" => $end),
);
}
}
?>
Также не забываем вписать параметр в bitrix:news.list (там же в news.php составе комплексного):

...
FILTER_NAME" => "arrFilter", ...

bitrixone © 2024