Filter name bitrix не работает

Не используйте FILTER_NAME в компонентах Битрикса

Сегодня пришлось разбираться с взаимодействием между компонентами «bitrix:catalog.smart.filter» и «bitrix:catalog.section» в комплексном компоненте «bitrix:catalog», что находится по пути «/bitrix/components/bitrix/catalog/templates/.default/section.php».

Для меня было не ясно, как данные из фильтра передаются в раздел и показывается только выбранные товары.

Оказалось в этом участвует переменная $arParams[‘FILTER_NAME’], она задает имя переменной фильтра и используется следующим образом в компонентах:

На первый взгляд все логично, но если задать в комплексном компоненте

То есть, $arParams[‘FILTER_NAME’]=’arParams’, такое название фильтра непредсказуемо ломает в нашем примере раздел каталога.

Использование названий фильтра совпадающих с используемыми переменными может поломать сайт, например, ‘APPLICATION’.

Совет от Аркадия Паровозова:
«Дети, Саши и Маши, избегайте использования FILTER_NAME в Битриксе, а если придется применить, то проверяйте на совпадение с существующими переменными и НИКОГДА не делайте как в примере ниже.»

Предупреждаю, что тесты на боевых сайтах опасны!
За все ваши действия несете полную ответственность!

Спасибо за внимание!

P.S. На вопрос «Доведено ли это до разработчиков?», отвечаю, что нет.

Я считаю, что программист/пользователям должен знать об опасности в первую очередь и сможет ее избежать, а разработчики быстрее отреагируют.

Основная угроза в неправильном использовании ‘FILTER_NAME’. Если используете значение ‘FILTER_NAME’ по умолчанию, возможно у вас все работает нормально.

Важно это знать программистам/пользователям в первую очередь потому, что не все системы на Битриксе обновляются и используют последнюю версию и обновление их не затронет, а угроза все равно остается.

Источник

arFilter не фильтрует

Здравствуйте. Только не пинайте сильно, но не могу применить элементарный фильтр. Посмотрел кучу примером, но.

Пытаюсь всего-лишь вывести элементы одного раздела.

Подскажите, что не так.

В bitrix.news не работает, с bitrix.news.list уже разобрался.

Как сделать, чтобы работал в bitrix.news?

может быть натолкнет на мысли

Удалил из section.php

Не помогло. Может не на те мысли меня натолкнуло?

Код
‘; $APPLICATION->IncludeComponent( «bitrix:news.list», «», Array( «IBLOCK_TYPE» => $arParams[«IBLOCK_TYPE»], «IBLOCK_ID» => $arParams[«IBLOCK_ID»], «NEWS_COUNT» => $arParams[«NEWS_COUNT»], «SORT_BY1» => $arParams[«SORT_BY1»], «SORT_ORDER1» => $arParams[«SORT_ORDER1»], «SORT_BY2» => $arParams[«SORT_BY2»], «SORT_ORDER2» => $arParams[«SORT_ORDER2»], «FIELD_CODE» => $arParams[«LIST_FIELD_CODE»], «PROPERTY_CODE» => $arParams[«LIST_PROPERTY_CODE»], «DISPLAY_PANEL» => $arParams[«DISPLAY_PANEL»], «SET_TITLE» => $arParams[«SET_TITLE»], «SET_STATUS_404» => $arParams[«SET_STATUS_404»], «INCLUDE_IBLOCK_INTO_CHAIN» => $arParams[«INCLUDE_IBLOCK_INTO_CHAIN»], «ADD_SECTIONS_CHAIN» => $arParams[«ADD_SECTIONS_CHAIN»], «CACHE_TYPE» => $arParams[«CACHE_TYPE»], «CACHE_TIME» => $arParams[«CACHE_TIME»], «CACHE_FILTER» => $arParams[«CACHE_FILTER»], «DISPLAY_TOP_PAGER» => $arParams[«DISPLAY_TOP_PAGER»], «DISPLAY_BOTTOM_PAGER» => $arParams[«DISPLAY_BOTTOM_PAGER»], «PAGER_TITLE» => $arParams[«PAGER_TITLE»], «PAGER_TEMPLATE» => $arParams[«PAGER_TEMPLATE»], «PAGER_SHOW_ALWAYS» => $arParams[«PAGER_SHOW_ALWAYS»], «PAGER_DESC_NUMBERING» => $arParams[«PAGER_DESC_NUMBERING»], «PAGER_DESC_NUMBERING_CACHE_TIME» => $arParams[«PAGER_DESC_NUMBERING_CACHE_TIME»], «PAGER_SHOW_ALL» => $arParams[«PAGER_SHOW_ALL»], «DISPLAY_DATE» => $arParams[«DISPLAY_DATE»], «DISPLAY_NAME» => «Y», «DISPLAY_PICTURE» => $arParams[«DISPLAY_PICTURE»], «DISPLAY_PREVIEW_TEXT» => $arParams[«DISPLAY_PREVIEW_TEXT»], «PREVIEW_TRUNCATE_LEN» => $arParams[«PREVIEW_TRUNCATE_LEN»], «ACTIVE_DATE_FORMAT» => $arParams[«LIST_ACTIVE_DATE_FORMAT»], «USE_PERMISSIONS» => $arParams[«USE_PERMISSIONS»], «GROUP_PERMISSIONS» => $arParams[«GROUP_PERMISSIONS»], «FILTER_NAME» => $arParams[«FILTER_NAME»], «HIDE_LINK_WHEN_NO_DETAIL» => $arParams[«HIDE_LINK_WHEN_NO_DETAIL»], «CHECK_DATES» => $arParams[«CHECK_DATES»], «PARENT_SECTION» => $arResult[«VARIABLES»][«SECTION_ID»], «PARENT_SECTION_CODE» => $arResult[«VARIABLES»][«SECTION_CODE»], «DETAIL_URL» => $arResult[«FOLDER»].$arResult[«URL_TEMPLATES»][«detail»], ), $component );?>

Результат = 0 Вообще ничего не изменяется.

Цитата
Кирилл пишет:
Результат = 0 Вообще ничего не изменяется.

Потому что вы там ерунду какую-то написали.

Если вы установили фильтр в публичном файле перед подключением комплексного компонента, то вот это все лишнее пока:
$GLOBALS[$arParams[‘FILTER_NAME’]] = isset($GLOBALS[$arParams[‘FILTER_NAME’]]) && is_array($GLOBALS[$arParams[‘FILTER_NAME’]]) ? $GLOBALS[$arParams[‘FILTER_NAME’]] : array();

$GLOBALS[$arParams[‘FILTER_NAME’]] = array(
‘SECTION_ID’ => ’25’
);

Вот этой строчкой просто проверьте (без самодеятельности), доходит ли правильно фильтр до компонента или вы где-то его перебиваете.

$arParams[‘FILTER_NAME’] — передает имя переменной фильтра, которое вы указали при подключении комплексного компонента, т.е. там хранится значение равное ‘arrFilter’, что эквивалентно прямой записи $GLOBALS[‘arrFilter’] или global $arrFilter, но не $GLOBALS[$arParams[‘arrFilter’]], т.к. в $arParams[‘arrFilter’] у вас судя по всему ничего не хранится.

В публичную добавил:

Далее идет вызов bitrix:news

из section.php все ранее добавленное удалил.

Сорри за тупняки. Пока финансирования не дали приходится самому.

в публичной части у вас должно быть так:

global $arrFilter;
$arrFilter = array(«SECTION_ID» => «25»);

или так (записи равнозначны):

$GLOBALS[‘arrFilter’] = array(«SECTION_ID» => «25»);

Т.е. здесь мы глобальной переменной arrFilter записали массив.
Теперь параметру FILTER_NAME при подключении комплексного компонента необходимо указать имя этой вашей переменной, в которой хранится фильтр, чтобы компонент по этому имени смог получить ваш массив. Имя переменной — arrFilter.

Т.е. параметры будут выглядеть так:
IncludeComponent(«bitrix:news», «news_main_list», array(
«IBLOCK_TYPE» => «news»,
«IBLOCK_ID» => «3»,
.
«FILTER_NAME» => «arrFilter»,
.

Источник

arFilter не фильтрует

Здравствуйте. Только не пинайте сильно, но не могу применить элементарный фильтр. Посмотрел кучу примером, но.

Пытаюсь всего-лишь вывести элементы одного раздела.

Подскажите, что не так.

В bitrix.news не работает, с bitrix.news.list уже разобрался.

Как сделать, чтобы работал в bitrix.news?

может быть натолкнет на мысли

Удалил из section.php

Не помогло. Может не на те мысли меня натолкнуло?

Код
‘; $APPLICATION->IncludeComponent( «bitrix:news.list», «», Array( «IBLOCK_TYPE» => $arParams[«IBLOCK_TYPE»], «IBLOCK_ID» => $arParams[«IBLOCK_ID»], «NEWS_COUNT» => $arParams[«NEWS_COUNT»], «SORT_BY1» => $arParams[«SORT_BY1»], «SORT_ORDER1» => $arParams[«SORT_ORDER1»], «SORT_BY2» => $arParams[«SORT_BY2»], «SORT_ORDER2» => $arParams[«SORT_ORDER2»], «FIELD_CODE» => $arParams[«LIST_FIELD_CODE»], «PROPERTY_CODE» => $arParams[«LIST_PROPERTY_CODE»], «DISPLAY_PANEL» => $arParams[«DISPLAY_PANEL»], «SET_TITLE» => $arParams[«SET_TITLE»], «SET_STATUS_404» => $arParams[«SET_STATUS_404»], «INCLUDE_IBLOCK_INTO_CHAIN» => $arParams[«INCLUDE_IBLOCK_INTO_CHAIN»], «ADD_SECTIONS_CHAIN» => $arParams[«ADD_SECTIONS_CHAIN»], «CACHE_TYPE» => $arParams[«CACHE_TYPE»], «CACHE_TIME» => $arParams[«CACHE_TIME»], «CACHE_FILTER» => $arParams[«CACHE_FILTER»], «DISPLAY_TOP_PAGER» => $arParams[«DISPLAY_TOP_PAGER»], «DISPLAY_BOTTOM_PAGER» => $arParams[«DISPLAY_BOTTOM_PAGER»], «PAGER_TITLE» => $arParams[«PAGER_TITLE»], «PAGER_TEMPLATE» => $arParams[«PAGER_TEMPLATE»], «PAGER_SHOW_ALWAYS» => $arParams[«PAGER_SHOW_ALWAYS»], «PAGER_DESC_NUMBERING» => $arParams[«PAGER_DESC_NUMBERING»], «PAGER_DESC_NUMBERING_CACHE_TIME» => $arParams[«PAGER_DESC_NUMBERING_CACHE_TIME»], «PAGER_SHOW_ALL» => $arParams[«PAGER_SHOW_ALL»], «DISPLAY_DATE» => $arParams[«DISPLAY_DATE»], «DISPLAY_NAME» => «Y», «DISPLAY_PICTURE» => $arParams[«DISPLAY_PICTURE»], «DISPLAY_PREVIEW_TEXT» => $arParams[«DISPLAY_PREVIEW_TEXT»], «PREVIEW_TRUNCATE_LEN» => $arParams[«PREVIEW_TRUNCATE_LEN»], «ACTIVE_DATE_FORMAT» => $arParams[«LIST_ACTIVE_DATE_FORMAT»], «USE_PERMISSIONS» => $arParams[«USE_PERMISSIONS»], «GROUP_PERMISSIONS» => $arParams[«GROUP_PERMISSIONS»], «FILTER_NAME» => $arParams[«FILTER_NAME»], «HIDE_LINK_WHEN_NO_DETAIL» => $arParams[«HIDE_LINK_WHEN_NO_DETAIL»], «CHECK_DATES» => $arParams[«CHECK_DATES»], «PARENT_SECTION» => $arResult[«VARIABLES»][«SECTION_ID»], «PARENT_SECTION_CODE» => $arResult[«VARIABLES»][«SECTION_CODE»], «DETAIL_URL» => $arResult[«FOLDER»].$arResult[«URL_TEMPLATES»][«detail»], ), $component );?>

Результат = 0 Вообще ничего не изменяется.

Цитата
Кирилл пишет:
Результат = 0 Вообще ничего не изменяется.

Потому что вы там ерунду какую-то написали.

Если вы установили фильтр в публичном файле перед подключением комплексного компонента, то вот это все лишнее пока:
$GLOBALS[$arParams[‘FILTER_NAME’]] = isset($GLOBALS[$arParams[‘FILTER_NAME’]]) && is_array($GLOBALS[$arParams[‘FILTER_NAME’]]) ? $GLOBALS[$arParams[‘FILTER_NAME’]] : array();

$GLOBALS[$arParams[‘FILTER_NAME’]] = array(
‘SECTION_ID’ => ’25’
);

Вот этой строчкой просто проверьте (без самодеятельности), доходит ли правильно фильтр до компонента или вы где-то его перебиваете.

$arParams[‘FILTER_NAME’] — передает имя переменной фильтра, которое вы указали при подключении комплексного компонента, т.е. там хранится значение равное ‘arrFilter’, что эквивалентно прямой записи $GLOBALS[‘arrFilter’] или global $arrFilter, но не $GLOBALS[$arParams[‘arrFilter’]], т.к. в $arParams[‘arrFilter’] у вас судя по всему ничего не хранится.

В публичную добавил:

Далее идет вызов bitrix:news

из section.php все ранее добавленное удалил.

Сорри за тупняки. Пока финансирования не дали приходится самому.

в публичной части у вас должно быть так:

global $arrFilter;
$arrFilter = array(«SECTION_ID» => «25»);

или так (записи равнозначны):

$GLOBALS[‘arrFilter’] = array(«SECTION_ID» => «25»);

Т.е. здесь мы глобальной переменной arrFilter записали массив.
Теперь параметру FILTER_NAME при подключении комплексного компонента необходимо указать имя этой вашей переменной, в которой хранится фильтр, чтобы компонент по этому имени смог получить ваш массив. Имя переменной — arrFilter.

Т.е. параметры будут выглядеть так:
IncludeComponent(«bitrix:news», «news_main_list», array(
«IBLOCK_TYPE» => «news»,
«IBLOCK_ID» => «3»,
.
«FILTER_NAME» => «arrFilter»,
.

Источник

Умный фильтр не выдает результат.

Добрый день, уважаемые знатоки Bitrix!

Пожалуйста, помогите решить проблему! Наверное, что-то с URL.

Поставила компонент Каталог , ставлю Умный фильтр отдельно слева на сайте. Свойства инфоблока настроены на фильтр.
В принципе фильтр делает выборку по свойствам, но при нажатии на Показать, остается на той же странице, где делался запрос и ничего не показывает.

В настройках типа инфоблока стоят такие пути:

Инфоблок: #SITE_DIR#/aaaa/
Раздел: #SITE_DIR#/aaaa/#SECTION_CODE#/
Элемент: #SITE_DIR#/aaaa/#SECTION_CODE#/#ELEMENT_CODE#/

Теперь настройки компонента Каталог:

Каталог ЧПУ (относительно корня сайта): /aaaa/
Раздел: #SECTION_CODE#/
Детальная информация: #SECTION_CODE#/#ELEMENT_CODE#/
URL раздела для умного фильтра: #SECTION_ID#/filter/#SMART_FILTER_PATH#/apply/

Это надо создавать раздел filter? Создала раздел aaaa/filter/.

Настройки Умного фильтра есть вот такое ID раздела инфоблока: =

И что дальше делать? Видимо я что-то не сделала в настройках фильтра или сделала не то вообще. В PHP не сильна пока, к сожалению. Почитала документацию по фильтру, но мне не все понятно. Что надо ставить в Правило для обработки, Блок ЧПУ умного фильтра.

Ни в документации, ни в учебном курсе, ни в примере сайта в виртуальной лаборатории я не встречала пункт в компоненте Каталог «URL раздела для умного фильтра: #SECTION_ID#/filter/#SMART_FILTER_PATH#/apply/»

Продолжаю разговор сама с собой .))

Обратила внимание, что все свойства отображаются корректно, только при выборе свойств ярлычок сбоку показывает 0 товаров и при нажатии на кнопку «Показать» — ничего не происходит, соответственно. Где-то прочитала о совпадении FILTER_NAME у компонентов Умный фильтр и Каталог, у меня он одинаков arrFilter. Что может быть еще? Куда копать?

И что нужно указывать в «Поле» настройки фильтра в компоненте Каталог?

Очень нужна помощь.

Спасибо за отклик. Я уже думала, что никто не отзовется.
Продолжаю рассуждать. Если у кого будет желание, поправьте меня, пожалуйста.

Для уточнения — я поставила совсем свежую версию 1С-Bitrix УС. Пишу для того, что мне кажется, что документация и описание программы на сайте автора как-то не везде соответствуют текущей версии.

Провела эксперимент. Сделала новый инфоблок со свойствами, разделами, элементами. Поставила компонент «Каталог», в котором включила показ фильтра.
Прописала настройки :
Фильтр: arrFilter
Каталог ЧПУ (относительно корня сайта): /инфоблок/
Список разделов: /инфоблок/
Раздел: #SECTION_CODE#/
Детальная информация: #SECTION_CODE#/#ELEMENT_CODE#/
Url раздела для умного фильтра: #SECTION_CODE#/filter/#SMART_FILTER_PATH#/apply/

И о, радость! Фильтр заработал. НО! Я так понимаю, что это встроенный фильтр в компонент Каталог, он не «Умный», хотя работает так, как мне хотелось. Но опять НО. Фильтр появляется только на странице со списком элементов. Хотелось бы, чтобы появлялся на странице списка разделов. Для этого ставится Умный фильтр?

Попробовала сделать как написано https://dev.1c-bitrix.ru/learning/course/index.php?COURSE_ID=42&LESSON_ID=5167 .
Но в шаблоне компонента /bitrix/templates/ /components/bitrix/catalog/ ­шаблон_компонента>/section.php я не нашла блок фильтра вообще. Подставила код Умного фильтра — он появился на странице списка разделов, но не работает. А на странице списка элементов остался встроенный фильтр.

Пожалуйста, прокомментируйте мои действия.

Цитата
Марина написал:
А обязательно тип инфоблока и инфоблок должны называться Каталог / catalog?

Нет, это может быть и вообще абстрактный кусок ЧПУ пути, не какого отношения к каталогу не имеющего.

Вы бы название компонентов указали которые пытаетесь завести, а то по описанию складывается ощущение, что вы пытаетесь натравить фильтр на комплексный компонент каталога. И он не заводится, что в принципе логично.

Комплексный компонент уже включает в свой набор фильтр, который включается одной галочкой в настройке компонента, и если не чего не трогать сразу заработает. А вот отдельный к комплексному прикрутить, без знаний не тривиальная задача.

Как верно пишет Максим, если требуется собрать всю связку самостоятельно, для большей гибкости, то нужно брать отдельные компоненты и собирать все на них.

Я сейчас готовлю статью по ЧПУ, там я как раз показываю сборку разделов с подразделами, на основе отдельных компонентов, там не будет умного фильтра, но общий принцип раздельного создания будет такой же, вам останется на нужной странице разместить умный фильтр как отдельный компонент и настроить его.

Юрий Волошин «Я сейчас готовлю статью по ЧПУ. «

Очень интересная статья, но с нетерпением буду ждать вторую часть.)))

Наконец, у меня наступила ясность в работе комплексного компонента «Каталог» и, соответственно, встроенного Умного фильтра.
Но теперь появились новые проблемы. По тех. заданию фильтр должен находиться в левой части страницы, что не предусмотрено компонентом.
Нашла в Инете изумительный ролик по переносу УФ http://www.youtube.com/watch?v=Rbez1ep9TUE . Правда, описан метод для 14 версии Битрикса.
Сделала по второму методу — отложенные функции, покопавшись в 15-ой. Фильтр перенесся, НО при указании параметров для поиска становится неактивной кнопка «Показать». При сбросе условий становится опять активной.
Вот фрагмент кода шаблона (жирным шрифтом выделила мои вставки):

$this->SetViewTarget(«my_filter»);
$APPLICATION->IncludeComponent(«bitrix:catalog.smart.filter»,»»,array(
«IBLOCK_TYPE» => $arParams[«IBLOCK_TYPE»],
«IBLOCK_ID» => $arParams[«IBLOCK_ID»],
«SECTION_ID» => $arCurSection[‘ID’],
«FILTER_NAME» => $arParams[«FILTER_NAME»],
«PRICE_CODE» => $arParams[«PRICE_CODE»],
«CACHE_TYPE» => $arParams[«CACHE_TYPE»],
«CACHE_TIME» => $arParams[«CACHE_TIME»],
«CACHE_GROUPS» => $arParams[«CACHE_GROUPS»],
«SAVE_IN_SESSION» => «N»,
«FILTER_VIEW_MODE» => $arParams[«FILTER_VIEW_MODE»],
«XML_EXPORT» => «Y»,
«SECTION_TITLE» => «NAME»,
«SECTION_DESCRIPTION» => «DESCRIPTION»,
‘HIDE_NOT_AVAILABLE’ => $arParams[«HIDE_NOT_AVAILABLE»],
«TEMPLATE_THEME» => $arParams[«TEMPLATE_THEME»],
‘CONVERT_CURRENCY’ => $arParams[‘CONVERT_CURRENCY’],
‘CURRENCY_ID’ => $arParams[‘CURRENCY_ID’],
«SEF_MODE» => $arParams[«SEF_MODE»],
«SEF_RULE» => $arResult[«FOLDER»].$arResult[«URL_TEMPLATES»][«smart_filter»],
«SMART_FILTER_PATH» => $arResult[«VARIABLES»][«SMART_FILTER_PATH»],
«PAGER_PARAMS_NAME» => $arParams[«PAGER_PARAMS_NAME»],
),
$component,
array(‘HIDE_ICONS’ => ‘Y’)
);
$this->EndViewTarget();
?>

Вставка по месту: ShowViewContent(«my_filter»);?>

Может подскажет кто, в чем дело?

Лихо взялась, Битрикс еще не снится по ночам?

Причина в том, что $this-> это как раз в компоненте использовать нужно, а чтоб компонент целиком запихнуть воспользуйтесь

Нет, не снится. Я по ночам работаю.

Простой способ тоже еще не совсем прост для меня. )

Но, подумав, решила, что этот путь тоже не очень подходит, т.к. я хотела средствами html поставить фильтр слева, что означает, что на других «страницах » компонента Каталог появляется пустое место. А ставить в шаблон сайта тоже нельзя. Т.е. надо делать отдельный шаблон сайта.

Подожду вторую часть статьи Волошина и потом буду принимать решение.

Добрый день!
Пока писала вопрос, решила проблему )))
Оставлю, вдруг пригодится.
Внедряю Умный фильтр на странице с комплексным компонентом.
Код фильтра помещаю в section.php (код в следующем сообщении)

FILTER_NAME у каталога и смарт фильтра равны «»

В комплексном компоненте Каталог ВКЛЮЧЕН фильтр. Просто галочку поставить.

Источник

Читайте также:  Как починить файл pptx
Оцените статью