-
Notifications
You must be signed in to change notification settings - Fork 96
Мультивалютность в умном фильтре
Valentin Ryabov edited this page Sep 14, 2015
·
1 revision
Существует проблема, что если у товаров цена указана в разных валютах - в каталоге цена отображается корректно, но фильтр по цене фильтрует без учета различных валют (т.е. 11руб окажется больше, чем 10$), а также подставляются некорректные числа в ползунки фильтра по цене. Для решения этого, необходимо компонент умного фильтра перенести в свое адресное пространство. А далее редактируем файлы component.php и class.php.
Изменения в файле component.php
if(isset($arItem["PRICE"]))
{
// if(strlen($arItem["VALUES"]["MIN"]["HTML_VALUE"]) && strlen($arItem["VALUES"]["MAX"]["HTML_VALUE"]))
// ${$FILTER_NAME}["><CATALOG_PRICE_".$arItem["ID"]] = array($arItem["VALUES"]["MIN"]["HTML_VALUE"], $arItem["VALUES"]["MAX"]["HTML_VALUE"]);
// elseif(strlen($arItem["VALUES"]["MIN"]["HTML_VALUE"]))
// ${$FILTER_NAME}[">=CATALOG_PRICE_".$arItem["ID"]] = $arItem["VALUES"]["MIN"]["HTML_VALUE"];
// elseif(strlen($arItem["VALUES"]["MAX"]["HTML_VALUE"]))
// ${$FILTER_NAME}["<=CATALOG_PRICE_".$arItem["ID"]] = $arItem["VALUES"]["MAX"]["HTML_VALUE"];
// >>>>>>>>>>>>>>>>>>> CITFACT CODE
if(strlen($arItem["VALUES"]["MIN"]["HTML_VALUE"]) || strlen($arItem["VALUES"]["MAX"]["HTML_VALUE"])){
//Конвертируем входящие цены в разные валюты $MIN_PRICE = Array();
$MIN_PRICE['RUB'] = CCurrencyRates::ConvertCurrency($arItem["VALUES"]["MIN"]["HTML_VALUE"], "RUB", "RUB") ;
$MIN_PRICE['EUR'] = CCurrencyRates::ConvertCurrency($arItem["VALUES"]["MIN"]["HTML_VALUE"], "RUB", "EUR") ;
$MIN_PRICE['USD'] = CCurrencyRates::ConvertCurrency($arItem["VALUES"]["MIN"]["HTML_VALUE"], "RUB", "USD") ;
$MAX_PRICE = Array();
$MAX_PRICE['RUB'] = CCurrencyRates::ConvertCurrency($arItem["VALUES"]["MAX"]["HTML_VALUE"], "RUB", "RUB") ;
$MAX_PRICE['EUR'] = CCurrencyRates::ConvertCurrency($arItem["VALUES"]["MAX"]["HTML_VALUE"], "RUB", "EUR") ;
$MAX_PRICE['USD'] = CCurrencyRates::ConvertCurrency($arItem["VALUES"]["MAX"]["HTML_VALUE"], "RUB", "USD") ;
$arPricesFilter = Array(
"LOGIC" => "OR",
"0" => Array(
'>=CATALOG_PRICE_'.$arItem["ID"] => $MIN_PRICE['RUB'],
'<=CATALOG_PRICE_'.$arItem["ID"] => $MAX_PRICE['RUB'],
'CATALOG_CURRENCY_'.$arItem["ID"] => "RUB",
'!CATALOG_PRICE_'.$arItem["ID"] => false
),
"1" => Array(
'>=CATALOG_PRICE_'.$arItem["ID"] => $MIN_PRICE['EUR'],
'<=CATALOG_PRICE_'.$arItem["ID"] => $MAX_PRICE['EUR'],
'CATALOG_CURRENCY_'.$arItem["ID"] => "EUR",
'!CATALOG_PRICE_'.$arItem["ID"] => false
),
"2" => Array(
'>=CATALOG_PRICE_'.$arItem["ID"] => $MIN_PRICE['USD'],
'<=CATALOG_PRICE_'.$arItem["ID"] => $MAX_PRICE['USD'],
'CATALOG_CURRENCY_'.$arItem["ID"] => "USD",
'!CATALOG_PRICE_'.$arItem["ID"] => false
),
);
//Соединяем массив фильров
${$FILTER_NAME} =array_merge(${$FILTER_NAME}, Array($arPricesFilter));
}
// <<<<<<<<<<<<<<< CITFACT CODE
Изменения в файле class.php (в функции fillItemPrices() изменены две строки)
if (isset($arElement["MIN_VALUE_NUM"]) && isset($arElement["MAX_VALUE_NUM"]))
{
$currency = $arElement["VALUE"];
$existCurrency = strlen($currency) > 0;
if ($existCurrency)
$currency = $this->facet->lookupDictionaryValue($currency);
if ($this->convertCurrencyId && $existCurrency)
$priceValue = CCurrencyRates::ConvertCurrency($arElement["MIN_VALUE_NUM"], $currency, $this->convertCurrencyId);
else
$priceValue = $arElement["MIN_VALUE_NUM"];
if (
!isset($resultItem["VALUES"]["MIN"]["VALUE"])
|| $resultItem["VALUES"]["MIN"]["VALUE"] > $priceValue
)
{
// $resultItem["VALUES"]["MIN"]["VALUE"] = $priceValue; - эту строку убираем
$resultItem["VALUES"]["MIN"]["VALUE"] = CCurrencyRates::ConvertCurrency($priceValue, $currency, "RUB") ; // эту строку добавляем
if ($existCurrency)
$resultItem["VALUES"]["MIN"]["CURRENCY"] = $currency;
}
if ($this->convertCurrencyId && $existCurrency)
$priceValue = CCurrencyRates::ConvertCurrency($arElement["MAX_VALUE_NUM"], $currency, $this->convertCurrencyId);
else
$priceValue = $arElement["MAX_VALUE_NUM"];
if (
!isset($resultItem["VALUES"]["MAX"]["VALUE"])
|| $resultItem["VALUES"]["MAX"]["VALUE"] < $priceValue
)
{
// $resultItem["VALUES"]["MAX"]["VALUE"] = $priceValue; - эту строку убираем
$resultItem["VALUES"]["MAX"]["VALUE"] = CCurrencyRates::ConvertCurrency($priceValue, $currency, "RUB") ; // эту строку добавляем
if ($existCurrency)
$resultItem["VALUES"]["MAX"]["CURRENCY"] = $currency;
}
}
Welcome to the bitrix.exam2 wiki! Битрикс, подготовка к экзамену 2 https://github.com/donitz1609/bitrix.exam2