
[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_КОД_ВАЛЮТЫ |
Все. При изменении курса валюты, кеш будет сброшен. Естественно, если используется автокеширование - это условие применимости тегированного кеша.