Добрый день! Недавно столкнулся с тем, что в модуле "Валюты" не предусмотрено обновление курса валют для KZT.
Несмотря на то, что базовой валютой является KZT, курсы валют "подтягивались" для RUB (странное поведение, не перестаю удивляться разработчикам Битрикс и их "гению инженерной мысли"). Пришлось залезть в исходники модуля и, немного покопавшись, переписать "под себя" функцию обновления курсов валют на сайте. Следующий код поместил в init.php. Затем создал агент в Битрикс, а стандартный агент из модуля удалил. Протестировал. Курсы обновляются и проблем нет.
use Bitrix\Main\Localization\Loc, Bitrix\Main\Loader, Bitrix\Main\Web\HttpClient, Bitrix\Currency; function GetRatesFromKazakhstanNationalBank() { global $DB, $APPLICATION; if (!Loader::includeModule('currency')) { return false; } $baseCurrency = 'KZT'; $tenderixCurrencyList = array('RUB', 'UAH', 'EUR', 'USD'); $currencyTenderixRateList = array(); $date = date('d.m.Y'); $url = 'http://www.nationalbank.kz/rss/get_rates.cfm?fdate=' . $date; $http = new HttpClient(); $data = $http->get($url); $charset = 'windows-1251'; $matches = array(); if (preg_match("/<"."\?XML[^>]{1,}encoding=[\"']([^>\"']{1,})[\"'][^>]{0,}\?".">/i", $data, $matches)) { $charset = trim($matches[1]); } $data = preg_replace("#<!DO CTYPE[^>]+?>#i", '', $data); $data = preg_replace("#<"."\\?XML[^>]+?\\?".">#i", '', $data); $data = $APPLICATION->ConvertCharset($data, $charset, SITE_CHARSET); $objXML = new CDataXML(); $res = $objXML->LoadString($data); if ($res !== false) $data = $objXML->GetArray(); else $data = false; if (is_array($data) && count($data["rates"]["#"]["item"])>0) { foreach($tenderixCurrencyList as $tenderixCurrency) { $currencyList = $data["rates"]["#"]["item"]; foreach ($currencyList as &$currencyRate) { if ($currencyRate["#"]["title"][0]["#"] == $tenderixCurrency) { $currencyTenderixRateList[$tenderixCurrency]['STATUS'] = 'OK'; $currencyTenderixRateList[$tenderixCurrency]['RATE_CNT'] = (int)$currencyRate["#"]["quant"][0]["#"]; $currencyTenderixRateList[$tenderixCurrency]['RATE'] = (float)str_replace(",", ".", $currencyRate["#"]["description"][0]["#"]); $currencyTenderixRateList[$tenderixCurrency]['CURRENCY'] = $tenderixCurrency; $currencyTenderixRateList[$tenderixCurrency]['DATE_RATE'] = $date; break; } } } unset($currencyRate, $currencyList, $tenderixCurrencyList, $tenderixCurrency); foreach($currencyTenderixRateList as $currency => $rate) { if ($rate['STATUS'] == 'OK') { $arFilter = array( "CURRENCY" => $rate['CURRENCY'], "DATE_RATE"=> $rate['DATE_RATE'] ); $by = "date"; $order = "desc"; $rsRate = CCurrencyRates::GetList($by, $order, $arFilter); if(!$arRate = $rsRate->Fetch()) CCurrencyRates::Add($rate); } } } return 'GetRatesFromKazakhstanNationalBank()'; |