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

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

15 Фев 2020
Дмитрий М.
791

Напишем класс для получения списка и конвертации курсов валют. Информацию о курсах валют к рублю будем получить с сайта ЦБ (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
#Хлебные крошки, #1С Битрикс, #Bitrix CMS, #bitrix:breadcrumbs, #component_epilog, #кэширование
1 Окт 2018
#bitrix, #robots.txt, #sitemap.xml, #поддомены, #мультисайтовость
16 Окт 2018
#bitrix, #bitrix:catalog.section, #скидки, #товары со скидкой, #страница скидок, #страница со скидками
4 Окт 2018
#ресайз изображений, #1С Битрикс, #Bitrix CMS
3 Мар 2019
#bitrix, #пользовательские свойства, #тип свойств, #привязка к элементам
27 Ноя 2019
#Bitrix CMS, #breadcrumb, #bitrix:breadcrumbs, #хлебные крошки, #настройка
13 Фев 2019
#bitrix, #свойства элементов, #обработчик событий, #OnBeforeIBlockElementUpdate, #OnIBlockElementSetPropertyValues
21 Июл 2020