Привет!
В продукте есть возможность подгружать курс валюты с сайта Центрального Банка РФ при редактировании курса валюты, но возможность делать это автоматически каждый день, без каких либо усилий, отсутствует.[spoiler]
Проблема решается следующим образом:
1. В /bitrix/php_interface/init.php пишем функцию:
2. Создаём агент и указываем нашу функцию, интервал - 86400(сутки).
Таким образом, каждый день на сайте будет обновляться курс конкретной валюты
В продукте есть возможность подгружать курс валюты с сайта Центрального Банка РФ при редактировании курса валюты, но возможность делать это автоматически каждый день, без каких либо усилий, отсутствует.[spoiler]
Проблема решается следующим образом:
1. В /bitrix/php_interface/init.php пишем функцию:
function GetRateFromCBR($CURRENCY) { global $DB; global $APPLICATION; CModule::IncludeModule('currency'); if(!CCurrency::GetByID($CURRENCY)) //такой валюты нет на сайте, агент в этом случае удаляется return false; $DATE_RATE=date("d.m.Y");//сегодня $QUERY_STR = "date_req=".$DB->FormatDate($DATE_RATE, CLang::GetDateFormat("SHORT", $lang), "D.M.Y"); //делаем запрос к www.cbr.ru с просьбой отдать курс на нынешнюю дату $strQueryText = QueryGetData("www.cbr.ru", 80, "/scripts/XML_daily.asp", $QUERY_STR, $errno, $errstr); //получаем XML и конвертируем в кодировку сайта $charset = "windows-1251"; if (preg_match("/<"."\?XML[^>]{1,}encoding=[\"']([^>\"']{1,})[\"'][^>]{0,}\?".">/i", $strQueryText, $matches)) { $charset = Trim($matches[1]); } $strQueryText = eregi_replace("<!DOCTYPE[^>]{1,}>", "", $strQueryText); $strQueryText = eregi_replace("<"."\?XML[^>]{1,}\?".">", "", $strQueryText); $strQueryText = $APPLICATION->ConvertCharset($strQueryText, $charset, SITE_CHARSET); require_once($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/classes/general/xml.php"); //парсим XML $objXML = new CDataXML(); $res = $objXML->LoadString($strQueryText); if($res !== false) $arData = $objXML->GetArray(); else $arData = false; $NEW_RATE=Array(); //получаем курс нужной валюты $CURRENCY if (is_array($arData) && count($arData["ValCurs"]["#"]["Valute"])>0) { for ($j1 = 0; $j1<count($arData["ValCurs"]["#"]["Valute"]); $j1++) { if ($arData["ValCurs"]["#"]["Valute"][$j1]["#"]["CharCode"][0]["#"]==$CURRENCY) { $NEW_RATE['CURRENCY']=$CURRENCY; $NEW_RATE['RATE_CNT'] = IntVal($arData["ValCurs"]["#"]["Valute"][$j1]["#"]["Nominal"][0]["#"]); $NEW_RATE['RATE'] = DoubleVal(str_replace(",", ".", $arData["ValCurs"]["#"]["Valute"][$j1]["#"]["Value"][0]["#"])); $NEW_RATE['DATE_RATE']=$DATE_RATE; break; } } } if ((isset($NEW_RATE['RATE']))&&(isset($NEW_RATE['RATE_CNT']))) { //курс получили, возможно, курс на нынешнюю дату уже есть на сайте, проверяем CModule::IncludeModule('currency'); $arFilter = array( "CURRENCY" => $NEW_RATE['CURRENCY'], "DATE_RATE"=>$NEW_RATE['DATE_RATE'] ); $by = "date"; $order = "desc"; $db_rate = CCurrencyRates::GetList($by, $order, $arFilter); if(!$ar_rate = $db_rate->Fetch()) //такого курса нет, создаём курс на нынешнюю дату CCurrencyRates::Add($NEW_RATE); } //возвращаем код вызова функции, чтобы агент не "убился" return 'GetRateFromCBR("'.$CURRENCY.'");'; } |
2. Создаём агент и указываем нашу функцию, интервал - 86400(сутки).
Таким образом, каждый день на сайте будет обновляться курс конкретной валюты