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;
}
}
Класс содержит два метода:
- convertRate($val, $code) - метод принимает сумму $val в валюте и код валюты $code, а возвращает значение в рублях.
- rateList() - метод возвращает полный список курсов валют