Есть решение для чекбоксов.
Если у вас нет типа свойства - флажок, добавляем:
в 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 Интернет-Магазин.