Очень часто встает задача актуализации курсов валют на сайте. В некоторых интернет-магазинах до сих пор все цены привязаны к у.е., баксам и евро. Хотя это и неправильно. В общем, небольшое решение, как заставить курсы валют на сайте обновляться автоматически.[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(). Ее можно найти на просторах инета почти везде, например, здесь.
У меня такая задача: в БД цены на некоторые товары хранятся в евро, но они должны на сайте выводиться в рублях в зависимости от текущего кураса.
Вот я сделал так. Проверяем с помощью функции stristr строку, возвращаемую $arPrice["PRINT_VALUE"] на наличие текста в ней EUR. Если нет, то пусть так и выводится $arPrice["PRINT_VALUE"], а вот если такой текст обнаружен начинаем обрабатывать его.
Сначала я сделал так)) для проверки, $arPrice["DISCOUNT_VALUE"] возвращает float число, вот его я умножал на 44 и выводил с помощью функции CurrencyFormat по правилам вывода рублей. Работало )))
Потом пошел дальше и поставил вместо 44, значение, хранящееся в БД для евро по умолчанию.
Вот теперь думаю, как сделать так, чтоб выводилось значение с ЦБ. Почитал темку, хорошо сделано, но смущает наличие функции xml_array и отсутствие у меня файла /bitrix/php_interface/init.php. Может сделать все попроще?
<?
// Запросим с сайта центрального банка РФ курсы валют на текущую дату
$strQueryText = QueryGetData(
"www.cbr.ru",
80,
"/scripts/XML_daily.asp",
"date_req = date('d.m.Y')");
if (strlen($strQueryText)<=0)
{
БЕРЕМ ЗНАЧЕНИЕ ПО УМОЛЧАНИЮ из БД
}
else
{
echo htmlspecialchars($strQueryText);
}
?>
И вставить этот код в шаблон для вывода каталога товаров для краткой и полной версий. Понимаю, что частое обращение в инет, не очень хорошо. Но зато вариант простой и рабочий, наверное ))
Вместо моей функции xml2array() можно использовать стандартную обработку битрикса XML, она немного другой массив делает по структуре, но суть та же. Вызывается примерно так:
require_once($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/classes/general/xml.php");
$objXML = new CDataXML();
$objXML->LoadString($XMLresult);
$resultXML = $objXML->GetArray();
А обновление курсов валют можно производить не часто, хоть в сутки, для этого я писал в своем коде первые строки
$xml_file = $_SERVER['DOCUMENT_ROOT']."/bitrix/cache/currency_rates.xml";
if (filemtime($xml_file)+3600*6 < time() OR !file_exists($xml_file)) { // Проверяем обновление каждые 6 часов
Группы на сайте создаются не только сотрудниками «1С-Битрикс», но и партнерами компании. Поэтому мнения участников групп могут не совпадать с позицией компании «1С-Битрикс».