Есть решение для чекбоксов.
Если у вас нет типа свойства - флажок, добавляем:
в init.php
в компоненте фильтра(catalog.filter) изменяем CASE G на этот
все работает, проверял на свежей демо версии Bitrix Интернет-Магазин.
Если у вас нет типа свойства - флажок, добавляем:
Код |
---|
<? global $MESS; $MESS['IBLOCK_PROP_CHECKBOX_DESC'] = 'Флажок'; $MESS['IBLOCK_PROP_CHECKBOX_YES'] = 'Да'; $MESS['IBLOCK_PROP_CHECKBOX_NO'] = 'Нет'; $MESS['IBLOCK_PROP_CHECKBOX_NA'] = '(любой)'; class CIBlockPropertyCheckbox{ function GetUserTypeDescription(){ return array( 'PROPERTY_TYPE' => 'S', 'USER_TYPE' => 'Checkbox', 'DESCRIPTION' => GetMessage( 'IBLOCK_PROP_CHECKBOX_DESC' ), 'GetAdminListViewHTML' => array( 'CIBlockPropertyCheckbox', 'GetTextVal' ), 'GetPublicViewHTML' => array( 'CIBlockPropertyCheckbox', 'GetTextVal' ), 'GetPropertyFieldHtml' => array( 'CIBlockPropertyCheckbox', 'GetPropertyFieldHtml' ), 'AddFilterFields' => array( 'CIBlockPropertyCheckbox', 'AddFilterFields' ), 'GetPublicFilterHTML' => array( 'CIBlockPropertyCheckbox', 'GetFilterHTML' ), // It seems it doesn't work :( 'GetAdminFilterHTML' => array( 'CIBlockPropertyCheckbox', 'GetFilterHTML' ), 'ConvertToDB' => array( 'CIBlockPropertyCheckbox', 'ConvertToFromDB' ), 'ConvertFromDB' => array( 'CIBlockPropertyCheckbox', 'ConvertToFromDB' ), 'GetSearchContent' => array( 'CIBlockPropertyCheckbox', 'GetSearchContent' ), ); } function GetTextVal( $arProperty, $value, $strHTMLControlName ){ return $value['VALUE'] == 'Y' ? GetMessage( 'IBLOCK_PROP_CHECKBOX_YES' ) : GetMessage( 'IBLOCK_PROP_CHECKBOX_NO' ); } function GetPropertyFieldHtml( $arProperty, $value, $strHTMLControlName ){ return '<input type="checkbox" name="'.$strHTMLControlName['VALUE'].'" value="Y" '.( $value['VALUE'] == 'Y' ? 'checked="checked"' : '' ).'/>'; } function AddFilterFields( $arProperty, $strHTMLControlName, &$arFilter, &$filtered ){ if( isset( $_REQUEST[$strHTMLControlName['VALUE']] ) ){ $prefix = $_REQUEST[$strHTMLControlName['VALUE']] == 'Y' ? '=' : '!='; $arFilter[$prefix.'PROPERTY_'.$arProperty['ID']] = 'Y'; $filtered = TRUE; } } function GetFilterHTML( $arProperty, $strHTMLControlName ){ $select = '<select name="'.$strHTMLControlName['VALUE'].'"> <option value="" >'.GetMessage( 'IBLOCK_PROP_CHECKBOX_NA' ).'</option> <option value="Y" '.( $_REQUEST[$strHTMLControlName['VALUE']] == 'Y' ? 'selected="selected"' : '' ).'>'.GetMessage( 'IBLOCK_PROP_CHECKBOX_YES' ).'</option> <option value="N" '.( $_REQUEST[$strHTMLControlName['VALUE']] == 'N' ? 'selected="selected"' : '' ).'>'.GetMessage( 'IBLOCK_PROP_CHECKBOX_NO' ).'</option> </select>'; return $select; } function GetSearchContent( $arProperty, $value, $strHTMLControlName ){ $propId = $arProperty; // $arProperty contains property id, not array. // Is it bug in Bitrix, isn't it? $propParams = CIBlockProperty::GetByID( $propId )->Fetch(); return $value['VALUE'] == 'Y' ? $propParams['NAME'] : ''; } function ConvertToFromDB( $arProperty, $value ){ $value['VALUE'] = $value['VALUE'] == 'Y' ? 'Y' : 'N'; return $value; } function GetLength( $arProperty, $value ){ return 1; // checkbox is always filled } } AddEventHandler( 'iblock', 'OnIBlockPropertyBuildList', array( 'CIBlockPropertyCheckbox', 'GetUserTypeDescription' ) ); ?> |
в компоненте фильтра(catalog.filter) изменяем CASE G на этот
Код |
---|
case "G": $name = $FILTER_NAME."_pf[".$arProp["CODE"]."]"; $value = $arrPFV[$arProp["CODE"]]; if($arProp['USER_TYPE']=='Checkbox') { $res .= '<input type="checkbox" name="'.$name.'" value="Y" '.($value == 'Y' ? 'checked' : '').'/>'; if (strlen($value)>0) ${$FILTER_NAME}["PROPERTY"][$arProp["CODE"]] = $value; } if(!is_array($value) && $arProp['USER_TYPE']!='Checkbox') { $res .= '<input type="text" name="'.$name.'" size="'.$arParams["TEXT_WIDTH"].'" value="'.htmlspecialchars($value).'" />'; if (strlen($value) > 0) ${$FILTER_NAME}["PROPERTY"]["?".$arProp["CODE"]] = $value; } break; |
все работает, проверял на свежей демо версии Bitrix Интернет-Магазин.