Автоматическое обновление курса валют на сайте Битрикс

1303 просмотра
Автор: Николай Ковалёв

В редакциях Битрикс: Малый бизнес и выше есть функционал валют. Для валют можно подгружать курс на любую дату, но автоматизировать этот процесс простыми средствами нельзя. В этом статье реализуем функционал, который автоматически раз в сутки будет подгружать курс нужной нам валюты.

Первым делом добавляем в файл bitrix/php_interface/init.php этот код:

use Bitrix\Main;
use Bitrix\Main\Loader;
use Bitrix\Currency;

if(!function_exists('getCurrency')) {
    function getCurrency()
    {
        global $DB;
   
        Loader::includeModule('currency');
        $baseCurrency = Currency\CurrencyManager::getBaseCurrency();
   
        $currency = "RUB"; // валюта для которой получаем курс
        $date = date("d.m.Y");
        $url = "";
   
        switch ($baseCurrency)
        {
            case 'BYR':
            case 'BYN':
                $url = 'http://www.nbrb.by/Services/XmlExRates.aspx?ondate='.$DB->FormatDate($date, CLang::GetDateFormat('SHORT', LANGUAGE_ID), 'Y-M-D');
                break;
            case 'RUB':
            case 'RUR':
                $url = 'https://www.cbr.ru/scripts/XML_daily.asp?date_req='.$DB->FormatDate($date, CLang::GetDateFormat('SHORT', LANGUAGE_ID), 'D.M.Y');
                break;
        }
   
   
        $http = new Main\Web\HttpClient();
        $http->setRedirect(true);
        $data = $http->get($url);
   
        $charset = 'windows-1251';
        $matches = [];
        if (preg_match("/<"."\?XML[^>]{1,}encoding=[\"']([^>\"']{1,})[\"'][^>]{0,}\?".">/i", $data, $matches))
        {
            $charset = trim($matches[1]);
        }
        $data = preg_replace("#<!DOCTYPE[^>]+?>#i", '', $data);
        $data = preg_replace("#<"."\\?XML[^>]+?\\?".">#i", '', $data);
        $data = Main\Text\Encoding::convertEncoding($data, $charset, SITE_CHARSET);
   
        $objXML = new CDataXML();
        $res = $objXML->LoadString($data);
        if ($res !== false)
            $data = $objXML->GetArray();
        else
            $data = false;
   
        if(!empty($data) && is_array($data))
        {
            switch ($baseCurrency)
            {
                case 'BYR':
                case 'BYN':
                    if (!empty($data["DailyExRates"]["#"]["Currency"]) && is_array($data["DailyExRates"]["#"]["Currency"]))
                    {
                        $currencyList = $data['DailyExRates']['#']['Currency'];
                        foreach ($currencyList as $currencyRate)
                        {
                            if ($currencyRate["#"]["CharCode"][0]["#"] == $currency)
                            {
                                $result['STATUS'] = 'OK';
                                $result['RATE_CNT'] = (int)$currencyRate["#"]["Scale"][0]["#"];
                                $result['RATE'] = (float)str_replace(",", ".", $currencyRate["#"]["Rate"][0]["#"]);
                                break;
                            }
                        }
                        unset($currencyRate, $currencyList);
                    }
                    break;
                case 'RUB':
                case 'RUR':
                    if (!empty($data["ValCurs"]["#"]["Valute"]) && is_array($data["ValCurs"]["#"]["Valute"]))
                    {
                        $currencyList = $data["ValCurs"]["#"]["Valute"];
                        foreach ($currencyList as $currencyRate)
                        {
                            if ($currencyRate["#"]["CharCode"][0]["#"] == $currency)
                            {
                                $result['STATUS'] = 'OK';
                                $result['RATE_CNT'] = (int)$currencyRate["#"]["Nominal"][0]["#"];
                                $result['RATE'] = (float)str_replace(",", ".", $currencyRate["#"]["Value"][0]["#"]);
                                break;
                            }
                        }
                        unset($currencyRate, $currencyList);
                    }
                    break;
            }
        }
   
        if ($result['STATUS'] == 'OK')
        {
            $arFilter = array(
                "CURRENCY" => $currency,
                "DATE_RATE" => $date,
            );
            $by = "date";
            $order = "desc";
            $db_rate = CCurrencyRates::GetList($by, $order, $arFilter);
            if(!$ar_rate = $db_rate->Fetch())
            {
                $arFields = array(
                    "RATE" => $result["RATE"],
                    "RATE_CNT" => $result["RATE_CNT"],
                    "CURRENCY" => $currency,
                    "DATE_RATE" => $date,
                );
                if (!CCurrencyRates::Add($arFields))
                    echo "Ошибка добавления курса";
                else
                    echo "Курс добавлен";
            }
            else
            {
                echo "Курс уже существует";
            }
        }
   
        return "getCurrency();";
    }
}

В переменной $currency задаем необходимый код валюты для которой нужно подгружать курс. В моем случае это российский рубль RUB.

Теперь осталось создать агент, который раз в сутки будет выполнять написанную функцию. Заходим в агенты: Настройки, Настройки продукта, Агенты и создаем новый агент по примеру:

Готово! Курсы будут подгружаться автоматически по заданному расписанию.

голосов нет
Валюта цен: BYN RUB