[spoiler]
1. Конвертация осуществляется в классе CIBlockPriceTools, в методах GetItemPrices и GetOffersArray.
Вызовы этих методов теперь выглядят следующим образом:
function CIBlockPriceTools::GetItemPrices($IBLOCK_ID, $arCatalogPrices, $arItem, $bVATInclude = true, $arCurrencyParams = array()) |
function CIBlockPriceTools::GetOffersArray($IBLOCK_ID, $arElementID, $arOrder, $arSelectFields, $arSelectProperties, $limit, $arPrices, $vat_include, $arCurrencyParams = array()) |
$arCurrencyParams = array('CURRENCY_ID' => 'USD'); // конвертировать в доллары |
Ценовое предложение без конвертации:
array( "VALUE_NOVAT" => , "PRINT_VALUE_NOVAT" => , "VALUE_VAT" => , "PRINT_VALUE_VAT" => , "VATRATE_VALUE" => , "PRINT_VATRATE_VALUE" => , "DISCOUNT_VALUE_NOVAT" => , "PRINT_DISCOUNT_VALUE_NOVAT" => , "DISCOUNT_VALUE_VAT" => , "PRINT_DISCOUNT_VALUE_VAT" => , 'DISCOUNT_VATRATE_VALUE' => , 'PRINT_DISCOUNT_VATRATE_VALUE' => , "CURRENCY" => 'код валюты', 'ID' => 'ID ценового предложения', 'CAN_ACCESS' => 'возможность просмотра - Y/N', 'CAN_BUY' => 'возможность купить - Y/N', 'VALUE' => 'цена', 'PRINT_VALUE' => 'отформатированная цена для вывода', 'DISCOUNT_VALUE' => 'цена со скидкой', 'PRINT_DISCOUNT_VALUE' => 'отформатированная цена со скидкой' ) |
array( 'ORIG_VALUE_NOVAT' => , "VALUE_NOVAT" => , "PRINT_VALUE_NOVAT" => , 'ORIG_VALUE_VAT' => , "VALUE_VAT" => , "PRINT_VALUE_VAT" => , 'ORIG_VATRATE_VALUE' => , "VATRATE_VALUE" => , "PRINT_VATRATE_VALUE" => , 'ORIG_DISCOUNT_VALUE_NOVAT' => , "DISCOUNT_VALUE_NOVAT" => , "PRINT_DISCOUNT_VALUE_NOVAT" => , "ORIG_DISCOUNT_VALUE_VAT" => , "DISCOUNT_VALUE_VAT" => , "PRINT_DISCOUNT_VALUE_VAT" => , 'ORIG_DISCOUNT_VATRATE_VALUE' => , 'DISCOUNT_VATRATE_VALUE' => , 'PRINT_DISCOUNT_VATRATE_VALUE' => , 'ORIG_CURRENCY' => 'код исходной валюты', "CURRENCY" => 'код валюты, в которую конвертим', 'ID' => 'ID ценового предложения', 'CAN_ACCESS' => 'возможность просмотра - Y/N', 'CAN_BUY' => 'возможность покупки - Y/N', 'VALUE' => 'цена', 'PRINT_VALUE' => 'отформатированная цена для вывода', 'DISCOUNT_VALUE' => 'цена со скидкой', 'PRINT_DISCOUNT_VALUE' => 'отформатированная цена со скидкой' ) |
Если значения цен Вы получаете, используя другие класы - (например, CPrice) - конвертировать валюту Вам придется самостоятельно.
2. Для обновлении информации при изменении курса валюты использован тегированный кеш:
global $CACHE_MANAGER; $strCurrencyID = 'USD'; // валюта, в которую конвертируем $arCurrencyList = array(); /* заносим в массив $arCurrencyList все коды нужных валют из массива цен и задаем тэги */ if (!empty($arCurrencyList)) { if (defined("BX_COMP_MANAGED_CACHE")) { $arCurrencyList[] = $strCurrencyID; // добавляем валюту, в которую сконвертировали $arCurrencyList = array_unique($arCurrencyList); $CACHE_MANAGER->StartTagCache($this->GetCachePath()); foreach ($arCurrencyList as &$strOneCurrency) { $CACHE_MANAGER->RegisterTag("currency_id_".$strOneCurrency); } if (isset($strOneCurrency)) unset($strOneCurrency); $CACHE_MANAGER->EndTagCache(); } } |
Теги модуля валют записываются так:
currency_id_КОД_ВАЛЮТЫ |
Все. При изменении курса валюты, кеш будет сброшен. Естественно, если используется автокеширование - это условие применимости тегированного кеша.