Разработчики битрикса не потрудились научить фильтр каталога понимать поля типа "Привязка к элементам" - или, по служебному, типа "E".
Оказалось это вообще не предусмотрено в компоненте catalog.filter.
В данном посте я буду говорить о комплексном каталоге и его фильтре. Я переделал стандартный комплексный каталог уже давно, тогда мне нужно было научить его понимать сколько угодно типов цен и языков. Теперь дошел до фильтра, уже не привыкать.
Пути до файлов компонентов указываю стандартные битриксные, но, естественно, нужно вначале сделать свои компоненты, у вас путь изменится с
\bitrix\components\bitrix\catalog.filter\component.php
на
\bitrix\components\мойсайт\catalog.filter\component.php
Файл \bitrix\components\bitrix\catalog.filter\component.php
Строка примерно 304
сменить на
Строка с 308
сменить на
Начиная со строки 469 начинается такая конструкция:
Нам нужно добавить в этот свич разбор полей типа E
Разберем это место
Вот эта конструкция:
это имя свойства инфоблока.
Дело в том, что у меня в переменной $_SESSION['CLANGUAGE_ID'] хранится текущий язык,
а инфоблоки со свойствами товаров имеют свойства с переводами.
Например инфоблок свойства с кодом "VOLUME" у меня задан так:

У меня свойство это не имя элемента блока, а его свойство.
Если у вас сделано стандартно - значения свойства это его NAME.
В вашем случае следует изменить эти конструкции
на
Скачать готовый component.php вы можете тут:
В архиве уже переделанный под стандартные настройки файл component.php.
Можете потестировать, закинув в \bitrix\components\bitrix\catalog.filter\component.php, только не забудьте сделать резервную копию оригинального component.php.
Оказалось это вообще не предусмотрено в компоненте catalog.filter.
В данном посте я буду говорить о комплексном каталоге и его фильтре. Я переделал стандартный комплексный каталог уже давно, тогда мне нужно было научить его понимать сколько угодно типов цен и языков. Теперь дошел до фильтра, уже не привыкать.
Пути до файлов компонентов указываю стандартные битриксные, но, естественно, нужно вначале сделать свои компоненты, у вас путь изменится с
\bitrix\components\bitrix\catalog.filter\component.php
на
\bitrix\components\мойсайт\catalog.filter\component.php
Файл \bitrix\components\bitrix\catalog.filter\component.php
Строка примерно 304
if (in_array($arProp["CODE"],$arParams["PROPERTY_CODE"]) && in_array($arProp["PROPERTY_TYPE"], array("L", "N", "S")))
|
сменить на
if (in_array($arProp["CODE"],$arParams["PROPERTY_CODE"]) && in_array($arProp["PROPERTY_TYPE"], array("L", "N", "S", "E")))
|
Строка с 308
$arResult["arrProp"][$arProp["ID"]]["PROPERTY_TYPE"] = $arProp["PROPERTY_TYPE"]; if ($arProp["MULTIPLE"]=="Y") $arResult["arrProp"][$arProp["ID"]]["MULTIPLE"] = $arProp["MULTIPLE"]; |
сменить на
$arResult["arrProp"][$arProp["ID"]]["PROPERTY_TYPE"] = $arProp["PROPERTY_TYPE"];
if (in_array($arProp["PROPERTY_TYPE"], array("E")))
$arResult["arrProp"][$arProp["ID"]]["LINK_IBLOCK_ID"] = $arProp["LINK_IBLOCK_ID"];
if ($arProp["MULTIPLE"]=="Y") $arResult["arrProp"][$arProp["ID"]]["MULTIPLE"] = $arProp["MULTIPLE"];
|
Начиная со строки 469 начинается такая конструкция:
switch ($arProp["PROPERTY_TYPE"])
{
case "L":
...
break;
case "N":
...
break;
case "S":
...
break;
}
|
Нам нужно добавить в этот свич разбор полей типа E
if($arProp["PROPERTY_TYPE"]=="E"){
/////////////////////////////////////////////
//Нужно заполнить массив $arProp["VALUE_LIST"]
/////////////////////////////////////////////
$arLinkFilter = array (
"IBLOCK_ID" => $arProp["LINK_IBLOCK_ID"],
"ACTIVE" => "Y",
"ACTIVE_DATE" => "Y",
"CHECK_PERMISSIONS" => "Y",
);
$rsLink = CIBlockElement::GetList(array(), $arLinkFilter, false, false, array("ID","IBLOCK_ID","NAME","DETAIL_PAGE_URL", "PROPERTY_".$arProp["CODE"]."_".strtoupper($_SESSION['CLANGUAGE_ID']));
while($res=$rsLink->GetNext()){
//заполняем $arProp["VALUE_LIST"]
$arProp["VALUE_LIST"][$res['ID']]=$res["PROPERTY_".$arProp["CODE"]."_".strtoupper($_SESSION['CLANGUAGE_ID'])."_VALUE"];
}
/////////////////////////////////////////////
}
switch ($arProp["PROPERTY_TYPE"])
{
case "E":
case "L":
...
break;
case "N":
...
break;
case "S":
...
break;
}
|
Разберем это место
$rsLink = CIBlockElement::GetList(array(), $arLinkFilter, false, false, array("ID","IBLOCK_ID","NAME","DETAIL_PAGE_URL", "PROPERTY_".$arProp["CODE"]."_".strtoupper($_SESSION['CLANGUAGE_ID']));
while($res=$rsLink->GetNext()){
//заполняем $arProp["VALUE_LIST"]
$arProp["VALUE_LIST"][$res['ID']]=$res["PROPERTY_".$arProp["CODE"]."_".strtoupper($_SESSION['CLANGUAGE_ID'])."_VALUE"];
}
|
Вот эта конструкция:
"PROPERTY_".$arProp["CODE"]."_".strtoupper($_SESSION['CLANGUAGE_ID']) |
это имя свойства инфоблока.
Дело в том, что у меня в переменной $_SESSION['CLANGUAGE_ID'] хранится текущий язык,
а инфоблоки со свойствами товаров имеют свойства с переводами.
Например инфоблок свойства с кодом "VOLUME" у меня задан так:

У меня свойство это не имя элемента блока, а его свойство.
Если у вас сделано стандартно - значения свойства это его NAME.
В вашем случае следует изменить эти конструкции
$rsLink = CIBlockElement::GetList(array(), $arLinkFilter, false, false, array("ID","IBLOCK_ID","NAME","DETAIL_PAGE_URL", "PROPERTY_".$arProp["CODE"]."_".strtoupper($_SESSION['CLANGUAGE_ID']));
while($res=$rsLink->GetNext()){
//заполняем $arProp["VALUE_LIST"]
$arProp["VALUE_LIST"][$res['ID']]=$res["PROPERTY_".$arProp["CODE"]."_".strtoupper($_SESSION['CLANGUAGE_ID'])."_VALUE"];
}
|
на
$rsLink = CIBlockElement::GetList(array(), $arLinkFilter, false, false, array("ID","NAME");
while($res=$rsLink->GetNext()){
//заполняем $arProp["VALUE_LIST"]
$arProp["VALUE_LIST"][$res['ID']]=$res["NAME"];
}
|
Скачать готовый component.php вы можете тут:
В архиве уже переделанный под стандартные настройки файл component.php.
Можете потестировать, закинув в \bitrix\components\bitrix\catalog.filter\component.php, только не забудьте сделать резервную копию оригинального component.php.