Очень часто встает задача актуализации курсов валют на сайте. В некоторых интернет-магазинах до сих пор все цены привязаны к у.е., баксам и евро. Хотя это и неправильно. В общем, небольшое решение, как заставить курсы валют на сайте обновляться автоматически.[spoiler] Самый простой вариант:
$xml_file = $_SERVER['DOCUMENT_ROOT']."/bitrix/cache/currency_rates.xml";
if (filemtime($xml_file)+3600*6 < time() OR !file_exists($xml_file)) { // Проверяем обновление каждые 6 часов
$xml_data = file_get_contents("http://www.cbr.ru/scripts/XML_daily.asp");
if ($xml_data) {
file_put_contents($xml_file, $xml_data);
$data = xml2array($xml_data);
$data_values = array();
$data_nominal = array();
foreach ($data['ValCurs']['Valute'] as $valute) {
$data_values[$valute['CharCode']['value']] = str_replace(",", ".", $valute['Value']['value']);
$data_nominal[$valute['CharCode']['value']] = $valute['Nominal']['value'];
}
if (CModule::IncludeModule("currency") AND date("N") != 6 AND date("N") != 7 AND $data) { // Не обновляем курс валют по выходным
$currencies = array();
$rsCurrency = CCurrency::GetList($by, $order);
$base_currency = CCurrency::GetBaseCurrency();
while ($arCurrency = $rsCurrency->GetNext()) {
if ($arCurrency['CURRENCY'] != $base_currency) {
$arCurrency['TIMESTAMP'] = MakeTimeStamp($arCurrency['DATE_UPDATE'], "YYYY-MM-DD HH:MI:SS");
$r = CCurrencyRates::Add(array(
'CURRENCY' => $arCurrency['CURRENCY'],
'DATE_RATE' => $data['ValCurs']['attr']['Date'],
'RATE_CNT' => $data_nominal[$arCurrency['CURRENCY']],
'RATE' => $data_values[$arCurrency['CURRENCY']],
));
}
}
}
}
}
Этот код можно вставить, например, в /bitrix/php_interface/init.php или любой другой постоянно вызываемый файл. Как вариант, можно вставить в отдельный файл, который вызывается периодически, например, через CRON. Скрипт отрабатывает только при устаревании данных, поэтому его постоянный вызов не проблема.
Небольшое пояснение как работает. Скрипт каждый раз проверяет наличие и время последнего обновления XML-файла с курсами валют на сервере (на своем). Если файла нет или он старше заданного времени - скачивается новый файл с сайта ЦБ РФ и его данные заносятся в модуль "Валюты". Обновляются только те валюты, которые указаны в системе. По выходным курсы валют не обновляются. Скачанный файл хранится в папке обычного кэша, поэтому при очистке кэша он также будет удален.
ВАЖНО! Используется функция xml2array(). Ее можно найти на просторах инета почти везде, например, здесь.
Группы на сайте создаются не только сотрудниками «1С-Битрикс», но и партнерами компании. Поэтому мнения участников групп могут не совпадать с позицией компании «1С-Битрикс».