Не так давно в компоненте каталог появилась возможность выводить цены в одной валюте. Все работает замечательно.
Но вот фильтрация при таком выводе очень "хромает", фильтр строиться без учета валюты и ее курса.
При использование умного фильтра на входе мы имеем:
$arrFilter = array (
'OFFERS' => NULL,
'><CATALOG_PRICE_1' =>
array (
0 => '1572',
1 => '11405',
),
); |
Вот код который поможет модифицировать фильтр так чтобы учитывались значений разных валют.
<? // Elements dop filter
global ${$arParams["FILTER_NAME"]};
$ardopFilter = &${$arParams["FILTER_NAME"]};
//echo htmlspecialcharsbx(var_export($ardopFilter,1));
foreach ($ardopFilter as $key=>$val){
$match = array();
preg_match_all('/CATALOG_PRICE_(\S+)/msi',$key,$match);
if(count($match[1][0])>0){
unset($ardopFilter[$key]);
$dopFilter = array(
"LOGIC" => "OR",
);
$obCurrency = CCurrency::GetList();
while($arCurrency = $obCurrency->Fetch()){
if($arParams["CURRENCY_ID"] == $arCurrency['CURRENCY']){
$dopFilter[] = array(
$key => $val,
'CATALOG_CURRENCY_'.$match[1][0] => $arCurrency['CURRENCY'],
);
}else{
if(is_array($val))
$dopFilter[] = array(
$key => array(
CCurrencyRates::ConvertCurrency($val[0],$arParams["CURRENCY_ID"],$arCurrency['CURRENCY']),
CCurrencyRates::ConvertCurrency($val[1],$arParams["CURRENCY_ID"],$arCurrency['CURRENCY']),
),
'CATALOG_CURRENCY_'.$match[1][0] => $arCurrency['CURRENCY'],
);
else
$dopFilter[] = array(
$key => CCurrencyRates::ConvertCurrency($val,$arParams["CURRENCY_ID"],$arCurrency['CURRENCY']),
'CATALOG_CURRENCY_'.$match[1][0] => $arCurrency['CURRENCY'],
);
}
}
}
}
$ardopFilter[] = $dopFilter;
//echo htmlspecialcharsbx(var_export($ardopFilter,1));
?> |
Данный код подходит для вызова его после компонента умный фильтр в шаблоне комплексного компонента section.php
И в итоге мы получим следующий фильтр.
$arrFilter = array (
'OFFERS' => NULL,
0 =>
array (
'LOGIC' => 'OR',
0 =>
array (
'><CATALOG_PRICE_1' =>
array (
0 => '1572',
1 => '11405',
),
'CATALOG_CURRENCY_1' => 'RUB',
),
1 =>
array (
'><CATALOG_PRICE_1' =>
array (
0 => 51.829871414441,
1 => 376.03033300363,
),
'CATALOG_CURRENCY_1' => 'USD',
),
2 =>
array (
'><CATALOG_PRICE_1' =>
array (
0 => 40.328373524885,
1 => 292.58594150847,
),
'CATALOG_CURRENCY_1' => 'EUR',
),
3 =>
array (
'><CATALOG_PRICE_1' =>
array (
0 => 416.97612732095,
1 => 3025.198938992,
),
'CATALOG_CURRENCY_1' => 'UAH',
),
),
) |
То есть мы считаем, что фильтр у нас задан в валюте, которая указанна в настройках компонента и конвертируем ее значения во все валюты которые у нас есть в системе.