Созонов Алексей

Веб-разработчик

Изменить текстовое поле на select в catalog.filter

09.08.2015

Понадобилось мне на днях сделать фильтр на очередном проекте, но в стандартном фильтре Битрикса свойство “Привязка элементов” вместо выпадающего списка <select>…</select>, выводится текстовое поле <input type=“text”>. Проблема решилась так:

В файле \bitrix\templates\TEMPLATENAME\components\bitrix\catalog.filter\TEMPLATECOMPONENTNAME\result_modifier.php добавляем

$propsIDs = array();
$linkedBlocks = array();

foreach($arResult["arrProp"] as $id => $array)
    if($array["PROPERTY_TYPE"]=="E")
        $propsIDs[] = $id;

$rsProps = CIBlockProperty::GetList(Array("sort"=>"asc", "name"=>"asc"), Array(
    "ACTIVE" => "Y",
    "IBLOCK_ID" => $arParams["IBLOCK_ID"],
    "PROPERTY_TYPE" => "E"
    )
);
while ($arProps = $rsProps->GetNext())
    if(in_array($arProps["ID"],$propsIDs))
        $linkedBlocks[$arProps["LINK_IBLOCK_ID"]] = $arProps["ID"];

foreach($linkedBlocks as $prop)
    $arResult["ITEMS"]["PROPERTY_".$prop]["INPUT"] = '<select name="'.$arResult["ITEMS"]["PROPERTY_".$prop]["INPUT_NAME"].'">';

$rsLBlocks = CIBlockElement::GetList(Array("NAME"=>"ASC"), Array(
        "ACTIVE" => "Y",
        "IBLOCK_ID" => array_keys($linkedBlocks)
    ),
    false, false, array()
);
while ($arLBlocks = $rsLBlocks->GetNext())
    $arResult["ITEMS"]["PROPERTY_".$linkedBlocks[$arLBlocks["IBLOCK_ID"]]]["INPUT"] .=
        '<option value="'.$arLBlocks["ID"].'">'.$arLBlocks["NAME"].'</option>';

foreach($linkedBlocks as $prop)
    $arResult["ITEMS"]["PROPERTY_".$prop]["INPUT"] .= '</select>';
#Bitrix‏‎