Очень часто встает задача актуализации курсов валют на сайте. В некоторых интернет-магазинах до сих пор все цены привязаны к у.е., баксам и евро. Хотя это и неправильно. В общем, небольшое решение, как заставить курсы валют на сайте обновляться автоматически.[spoiler]
Самый простой вариант:
Этот код можно вставить, например, в /bitrix/php_interface/init.php или любой другой постоянно вызываемый файл. Как вариант, можно вставить в отдельный файл, который вызывается периодически, например, через CRON. Скрипт отрабатывает только при устаревании данных, поэтому его постоянный вызов не проблема.
Небольшое пояснение как работает. Скрипт каждый раз проверяет наличие и время последнего обновления XML-файла с курсами валют на сервере (на своем). Если файла нет или он старше заданного времени - скачивается новый файл с сайта ЦБ РФ и его данные заносятся в модуль "Валюты". Обновляются только те валюты, которые указаны в системе. По выходным курсы валют не обновляются. Скачанный файл хранится в папке обычного кэша, поэтому при очистке кэша он также будет удален.
ВАЖНО! Используется функция xml2array(). Ее можно найти на просторах инета почти везде, например, .
Самый простой вариант:
$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(). Ее можно найти на просторах инета почти везде, например, .