Разработчики битрикса не потрудились научить фильтр каталога понимать поля типа "Привязка к элементам" - или, по служебному, типа "E". Оказалось это вообще не предусмотрено в компоненте 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
Дело в том, что у меня в переменной $_SESSION['CLANGUAGE_ID'] хранится текущий язык, а инфоблоки со свойствами товаров имеют свойства с переводами. Например инфоблок свойства с кодом "VOLUME" у меня задан так:
У меня свойство это не имя элемента блока, а его свойство.
Если у вас сделано стандартно - значения свойства это его NAME. В вашем случае следует изменить эти конструкции
Скачать готовый component.php вы можете тут: component.zip В архиве уже переделанный под стандартные настройки файл component.php. Можете потестировать, закинув в \bitrix\components\bitrix\catalog.filter\component.php, только не забудьте сделать резервную копию оригинального component.php.
Вообще надо уже делать оппозицию. Многсайтовый патч, бесплатные шаблоны, полезные компоненты, готовая база IP по городам с уже подключенным модулем распознавания....
Можно все это объединить в один большой патч и, как это сейчас модно, распространять через файлообменники вместе с файлом "Зарабатывай 1000 евро в день с Radidsharой.doc".
Использовал метод описанный вами выше, все работает на 5+. Но как заставить в список фильтра попадать только те элементы которые есть в этом(тот который активен) разделе или если результатом фильтрации будет пустой список?
Громадное спасибо ! Только начинаю осваивать эту CMS, функция "фильтры" была одной из причин неосознанного выбора, каково же было моё разочарование когда вместо привычных на множестве сайтов выпадающих списков я увидел "дыры", в которых не работает даже поиск по подстроке !
Тем более радостно увидеть решение созданное в духе свободного софта. Вношу свои 5 копеек, как я научил фильтр показывать подкатегории в выпадающих списках:
Со строки 469 (примерно), заменить блок условия
if($arProp["PROPERTY_TYPE"]=="E"){ ...
на
if($arProp["PROPERTY_TYPE"]=="E"){
$arSubsectionFilter = array (
"IBLOCK_ID" => $arProp["LINK_IBLOCK_ID"],
"ACTIVE" => "Y",
"ACTIVE_DATE" => "Y",
"CHECK_PERMISSIONS" => "Y",
);
$arLinkFilter = array (
"IBLOCK_ID" => $arProp["LINK_IBLOCK_ID"],
"SECTION_ID" => '',
"ACTIVE" => "Y",
"ACTIVE_DATE" => "Y",
"CHECK_PERMISSIONS" => "Y",
);
# First, we get elements what are outside any subsection, i.e. in root of infoblock
$rsLink = CIBlockElement::GetList(array("name"=>"asc"), $arLinkFilter, false, false, array("ID","NAME"));
while($res=$rsLink->GetNext()){
$arProp["VALUE_LIST"][$res['ID']]=$res["NAME"];
}
# Next, we get ones under subsections
$rsSubsections = CIBlockSection::GetList(array('left_margin'=>'ASC'),$arSubsectionFilter,false);
while($resSubsection=$rsSubsections->GetNext()){
$arProp["VALUE_LIST"][$resSubsection['ID']]='--- '.$resSubsection["NAME"].' ---';
$children_id = $resSubsection['ID'];
$arLinkFilter['SECTION_ID'] = $children_id;
$rsLink = CIBlockElement::GetList(array("name"=>"asc"), $arLinkFilter, false, false, array("ID","NAME"));
while($res=$rsLink->GetNext()){
$arProp["VALUE_LIST"][$res['ID']]=$res["NAME"];
}
}
}
Пожалуйста подскажите, как можно научить Битрикс не только показывать иерархические выпадающие списки, но и фильтровать по множественным значениям, например выбрал "Книги/Компьютер/Программирование", получил в отфильтрованном списке всё что под папками "Python", "Lisp", "Java" ? По каким ключам искать ?
Спасибо, наконец разобрался с проблемой, хотя искал толковую инструкцию несколько недель!
Обнаружил еще такую возможность - если в свойстве, по которому происходит привязка к элементам, установить "Множ." в истину, то получим вместо выпадающего списка список множественного выбора. Может кому то пригодится.
У меня еще такой вопрос: в магазине есть 20 производителей и 15 разделов. Например в разделе "Компьютеры" фигурирует только три производителя из 20-ти. Но при текущих настройках компоненты пользователь в фильтре получает полный список производителей.
Каким образом можно выводить фильтр только по тем производителям, которые связаны с элементами конкретного раздела?
Добрый день, Дмитрий. Не могли бы выложить файл с компонентом ещё раз? очень нужен выпадающий список, а поскольку компонент существенно изменился с тех пор как вы его переделали, найти куда внести изменения оказалось непосильной задачей пока.. а ваш файл удалён с сервера за давностью(
Группы на сайте создаются не только сотрудниками «1С-Битрикс», но и партнерами компании. Поэтому мнения участников групп могут не совпадать с позицией компании «1С-Битрикс».