Глобальные фильтры на всякие случаи жизни

Глобальные фильтры на всякие случаи жизни
Просмотров: 8411 | Комментариев: 3

Глобальный фильтр, нужен чаще всего, для вывода определенных элементов, из общего массива, инфорблока. Спектр применяемости очень широкий. Используется чаще всего с компонентами: Список новостей, Новости, Элементы раздела, Каталог, Топ элементов каталога и Каталог.

Для включения фильтр достаточно проделать следующее: Перед вызовом компонента вставить код вида

$GLOBALS['Название_Фильтра'] = array(Массив с данными для фильтрации);

В параметрах компонента передать параметры включения фильтра и его название

$APPLICATION->IncludeComponent(
.....
"USE_FILTER" => "Y",
"FILTER_NAME" => "Название_Фильтра",
.....

Дальше идут примеры которые вы можете передать в $GLOBALS['Название_Фильтра'], в качестве "Название_Фильтра" буду вписывать "arrFilter". Данные примеры собраны из нескольких источников. И вы можете писать свои примеры в комментариях, лучшие будут добавлены в тело заметки.

Итак: погнали

Наличие не пустого свойства. Если у инфоблока есть свойство с заданным кодом (DISCOUNTS) оно не пустое и активно:

$GLOBALS['arrFilter'] = array('ACTIVE' => 'Y', '!PROPERTY_DISCOUNTS' => false);

Выборка элементов по их ID, если нужен один конкретный:

$GLOBALS['arrFilter'] = array('ID' => 12);

Или несколько:

$GLOBALS['arrFilter'] = array('ID' => array(10,11,12,13));

Элементы созданные за текущий день

$curdate = date('d.m.Y');
$arrFilter = Array(">=DATE_ACTIVE_FROM" => $curdate)

Элементы созданные последние два дня, где 86000 это количество секунд. Умножая этот параметр на количество дней, получим элементы за последние n (86000 * n) дней

$from = date('d.m.Y', time() - 86400);
$to = date("d.m.Y");
$arrFilter = Array(">=DATE_ACTIVE_FROM" => $from, "<=DATE_ACTIVE_FROM" => $to)

Отфильтровываем элементы у которых в свойстве "HIT" установлено "Yes". При этом HIT это список с несколькими значениями.

$GLOBALS['arrFilter'] = array("=PROPERTY_HIT_VALUE"=> "Yes");

Отфильтровываем элементы у которых в свойстве "HIT" установлено "Yes". При этом HIT это список с несколькими значениями. И э этого свойсва ID - 15

$GLOBALS['arrFilter'] = array("PROPERTY_15_VALUE"=>"Yes");

Отфильтровываем элементы у которых в свойстве "HIT" установлено "Yes". При этом HIT это список с несколькими значениями. И э этого свойсва ID - 15

$GLOBALS['arrFilter'] = array("PROPERTY_15_VALUE"=>"Yes");

Все элементы из раздела инфоблока, зная ID этого раздела. Например из 90-го

$GLOBALS['arrFilter']=array("SECTION_ID" => 90);

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

ruslan2243
А вы не делали такую штуку: В каталоге нужно выводить первыми товары с определенным свойством(город покупателя). Причем у покупателя может город меняться. Речь идет о том, чтобы показывать товары первыми в зависимости от города покупателя.
Николай Сухих
Как сделать случайную сортировку?
Код
$GLOBALS['arrFilter']=array("ORDER" => 'RAND');
У меня не работает.
Stepan T
Не самое очевидное, но очень полезное:

Взято с http://ftask.ru/2017/05/30/bitrix-%D0%B2-%D0%BA%D0%BE%D0%BC%D0%BF%D0%BB%D0%B5%D0%BA%D1%81%D0%BD%D0%BE­%D0%BC-%D0%BA%D0%BE%D0%BC%D0%BF%D0%BE%D0%BD%D0%B5%D0%BD%D1%82%D0%B5­-bitrixnews-%D0%BD%D0%B5-%D1%80%D0%B0%D0%B1%D0%BE%D1%82/


Для работы arrFilter в bitrix:news , необходимо несколько условий . В этом компоненте изначально нельзя использовать рукописные фильтры , но можно сделать пару хаков.. Не путать с bitrix:news.list . Это другой компонент.
1. Выставленные значения

1
2
3


"USE_FILTER" => "Y",
...
"FILTER_NAME" => "arrFilter",


2. массив $arrFilter сделать глобальным.


1
2
3
4


$arrFilter['property_att_hashtags'] = $mas_hashtag_new;

//например так:
$GLOBALS['arrFilter'] = $arrFilter;

3. в файле \bitrix\templates\mynametemplate\components\bitrix\news\news­\news.php
закомментировать вот этот код


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17


/*
$APPLICATION->IncludeComponent(
"bitrix:catalog.filter",
"",
Array(
"IBLOCK_TYPE" => $arParams["IBLOCK_TYPE"],
"IBLOCK_ID" => $arParams["IBLOCK_ID"],
"FILTER_NAME" => $arParams["FILTER_NAME"],
"FIELD_CODE" => $arParams["FILTER_FIELD_CODE"],
"PROPERTY_CODE" => $arParams["FILTER_PROPERTY_CODE"],
"CACHE_TYPE" => $arParams["CACHE_TYPE"],
"CACHE_TIME" => $arParams["CACHE_TIME"],
"CACHE_GROUPS" => $arParams["CACHE_GROUPS"],
"PAGER_PARAMS_NAME" => $arParams["PAGER_PARAMS_NAME"],
 ;)  ,
$component
); */

Пояснение по этому файлу. Если перед вызовом компонента мы определили arrFilter например в файле novosti\index.php, заходим в файл \bitrix\templates\mynametemplate\components\bitrix\news\news­\news.php и вставляем вот такой код:


1


echo '<pre>'.print_r($GLOBALS[$arParams['FILTER_NAME']], true).'</pre>';

Если вставить перед компонентом bitrix:catalog.filter — то выведется значение arrFilter; А если после — то пустой массив. Вывод bitrix:catalog.filter затирает значения, которые передаются через arrFilter.
4. Не забудьте правильно прописать нужные поля FILTER_PROPERTY_CODE , FILTER_FIELD_CODE,DETAIL_PROPERTY_CODE .
5. Обратите внимание на синтаксис массива arrFilter .
Дополнительно можете почитать чужую предысторию в форуме https://dev.1c-bitrix.ru/community/forums/forum6/topic31644/ , но там ошибка . Парень удалял(комментировал) bitrix:catalog.filter из файла section.php , а надо из news.php .