Skip to content

Мультивалютность в умном фильтре

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;
			}
		}
Clone this wiki locally