/ Пример работы с xml Bitrix на примере получения курса валют с ЦБ

Пример работы с xml Bitrix на примере получения курса валют с ЦБ

15 фев 2020
Дмитрий М.
4094

Напишем класс для получения списка и конвертации курсов валют. Информацию о курсах валют к рублю будем получить с сайта ЦБ (https://www.cbr.ru/scripts/XML_daily.asp) в виде XML.

Для начала нужно получить XML данные. Получать их будем при помощи класса для работы с HTTP запросами в Bitrix - HttpClient().


use Bitrix\Main\Web\HttpClient;
$httpClient = new HttpClient();
$httpClient->setHeader('Content-Type', 'application/xml; charset=UTF-8', true);
$httpClient->query($this->method, $this->url, $entityBody = null);
$content = $httpClient->getResult();
        

Теперь в переменной $content содержатся XML данные о курсах валют. Структура XML документа следующая:

<ValCurs Date="15.02.2020" name="Foreign Currency Market">
<Valute ID="R01010">
    <NumCode>036</NumCode>
    <CharCode>AUD</CharCode>
    <Nominal>1</Nominal>
    <Name>Австралийский доллар</Name>
    <Value>42,6916</Value>
</Valute>
<Valute ID="R01020A">
    <NumCode>944</NumCode>
    <CharCode>AZN</CharCode>
    <Nominal>1</Nominal>
    <Name>Азербайджанский манат</Name>
    <Value>37,4027</Value>
</Valute>

...

</ValCurs>
        

Далее обработаем XML данные и соберём их в массив индексами которого будут коды валют.

use Bitrix\Main\XML;
$xml = new CDataXML();
$xml->LoadString($httpClient->getResult());
$arCurrency = [];
$node = $xml->GetArray();
$Value = $xml->SelectNodes('/ValCurs/Valute/CharCode');
if ($node = $xml->SelectNodes('/ValCurs')):
    foreach ($node->children() as $arTabNode):
    $id = $arTabNode->getAttribute('ID');
    foreach($arTabNode->children() as $el):
        $arCurrency[$id][$el->name()] = iconv("windows-1251", "UTF-8", $el->textContent());
    endforeach;
    endforeach;
endif;
foreach($arCurrency as $val):
    $rates[$val['CharCode']] = array(
    'NAME' => $val['Name'],
    'CODE' => $val['CharCode'],
    'VALUE' => str_replace(',', '.',$val['Value']),
    );
endforeach;
        

В результате мы получили массив $rates в котором содержаться данные о курсе валют.

Оформим всё в виде класса CurrencyRate:

use Bitrix\Main\Web\HttpClient;
use Bitrix\Main\XML;

class CurrencyRate{
    private $method = 'GET';
    private $url = "https://www.cbr.ru/scripts/XML_daily.asp";
    private $arRate = [];

    public function __construct(){
    $httpClient = new HttpClient();
    $httpClient->setHeader('Content-Type', 'application/xml; charset=UTF-8', true);
    $httpClient->query($this->method, $this->url, $entityBody = null);
    $xml = new CDataXML();
    $xml->LoadString($httpClient->getResult());
    $arCurrency = [];
    $node = $xml->GetArray();
    $Value = $xml->SelectNodes('/ValCurs/Valute/CharCode');
    if ($node = $xml->SelectNodes('/ValCurs')):
        foreach ($node->children() as $arTabNode):
        $id = $arTabNode->getAttribute('ID');
        foreach($arTabNode->children() as $el):
            $arCurrency[$id][$el->name()] = iconv("windows-1251", "UTF-8", $el->textContent());
        endforeach;
        endforeach;
    endif;
    foreach($arCurrency as $val):
        $rates[$val['CharCode']] = array(
        'NAME' => $val['Name'],
        'CODE' => $val['CharCode'],
        'VALUE' => str_replace(',', '.',$val['Value']),
        );
    endforeach;
    $this->arRate = $rates;
    }

    public function convertRate($val, $code){
    $value = $this->arRate[$code]['VALUE']*$val;
    return $value;
    }

    public function rateList(){
    return $this->arRate;
    }
}
        

Класс содержит два метода:

  1. convertRate($val, $code) - метод принимает сумму $val в валюте и код валюты $code, а возвращает значение в рублях.
  2. rateList() - метод возвращает полный список курсов валют

Статья была полезна? Поблагодарите автора.

Самые читаемые
#1С Битрикс, #Bitrix CMS, #.htaccess, #настройка редиректов
4 авг 2019
#bitrix:news, #сортировка, #фильтрация, #bitrix:catalog, #catalog.section, #news.list
16 дек 2020
#Хлебные крошки, #1С Битрикс, #Bitrix CMS, #bitrix:breadcrumbs, #component_epilog, #кэширование
1 окт 2018
#bitrix, #свойства элементов, #обработчик событий, #OnBeforeIBlockElementUpdate, #OnIBlockElementSetPropertyValues
21 июл 2020
#Bitrix CMS, #breadcrumb, #bitrix:breadcrumbs, #хлебные крошки, #настройка
13 фев 2019
#ресайз изображений, #1С Битрикс, #Bitrix CMS
3 мар 2019
#bitrix, #robots.txt, #sitemap.xml, #поддомены, #мультисайтовость
16 окт 2018
#bitrix, #bitrix:catalog.section, #скидки, #товары со скидкой, #страница скидок, #страница со скидками
4 окт 2018
#bitrix, #пользовательские свойства, #тип свойств, #привязка к элементам
27 ноя 2019