CommerCentr
EN
Sign in

Обновление валюты с сайта cbr.ru [2.3]

#1
Здравствуйте, други и подруги !
Сегодня покажу небольшой фикс, который позволяет обновлять курс с сайта cbr.ru - тоесть центрального банка РФ для версий ос 2.3, без лишней теории переходим к делу:
открываем файлик, который находим по адресу admin/model/localisation/currency.php, там нас интересует функция:
public function refresh($force = false) {
$data = array();

if ($force) {
$query = $this->db->query("SELECT * FROM " . DB_PREFIX . "currency WHERE code != '" . $this->db->escape($this->config->get('config_currency')) . "'");
} else {
$query = $this->db->query("SELECT * FROM " . DB_PREFIX . "currency WHERE code != '" . $this->db->escape($this->config->get('config_currency')) . "' AND date_modified < '" . $this->db->escape(date('Y-m-d H:i:s', strtotime('-1 day'))) . "'");
}

foreach ($query->rows as $result) {
$data[] = $this->config->get('config_currency') . $result['code'] . '=X';
}

$curl = curl_init();

curl_setopt($curl, CURLOPT_URL, 'http://download.finance.yahoo.com/d/quotes.csv?s=' . implode(',', $data) . '&f=sl1&e=.csv');
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_HEADER, false);
curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, 30);
curl_setopt($curl, CURLOPT_TIMEOUT, 30);

$content = curl_exec($curl);

curl_close($curl);

$lines = explode("\n", trim($content));

foreach ($lines as $line) {
$currency = utf8_substr($line, 4, 3);
$value = utf8_substr($line, 11, 6);

if ((float)$value) {
$this->db->query("UPDATE " . DB_PREFIX . "currency SET value = '" . (float)$value . "', date_modified = '" . $this->db->escape(date('Y-m-d H:i:s')) . "' WHERE code = '" . $this->db->escape($currency) . "'");
}
}

$this->db->query("UPDATE " . DB_PREFIX . "currency SET value = '1.00000', date_modified = '" . $this->db->escape(date('Y-m-d H:i:s')) . "' WHERE code = '" . $this->db->escape($this->config->get('config_currency')) . "'");

$this->cache->delete('currency');
}

и заменяем на (уже написанную мастером) вот эту:
public function refresh($force = false) {
$data = array();
$query = $this->db->query("SELECT date_modified FROM " . DB_PREFIX . "currency WHERE code != '" . $this->db->escape($this->config->get('config_currency')) . "'");
if ($query->num_rows) {
foreach ($query->rows as $result) {
if ($result['date_modified']) {
$last_mod = date('Y-m-d', strtotime($result['date_modified']));
if ($last_mod == date('Y-m-d')) {
return true;
}
}
}
}
$codes = array();
$xml = new DOMDocument();
$url = 'http://www.cbr.ru/scripts/XML_daily.asp?date_req=' . date('d.m.Y');
if (@$xml->load($url)) {
$root = $xml->documentElement;
$items = $root->getElementsByTagName('Valute');
foreach ($items as $item) {
$code = $item->getElementsByTagName('CharCode')->item(0)->nodeValue;
$curs = $item->getElementsByTagName('Value')->item(0)->nodeValue;
$codes[] = $code;
$data[$code] = floatval(str_replace(',', '.', $curs));
}
$query = null;
$query = $this->db->query("SELECT code FROM " . DB_PREFIX . "currency WHERE code != '" . $this->db->escape($this->config->get('config_currency')) . "'");
foreach ($query->rows as $result) {
if (in_array($result['code'], $codes)) {
if ($data[$result['code']]) {
$new_val = 1 / (float)$data[$result['code']];
$this->db->query("UPDATE " . DB_PREFIX . "currency SET value = '" . (float)$new_val . "', date_modified = '" . $this->db->escape(date('Y-m-d H:i:s')) . "' WHERE code = '" . $this->db->escape($result['code']) . "'");
}
}
}
}
$this->cache->delete('currency');
}

сохраняем, заходим на главную панель в админке и проверяем обновленные курсы валют, приятного пользования, жмякаем лойс, если понравилось.
#2
ще б під 3-ку, та під Укр. нац. банк, було б взагалі фешенєбельно
#3
Bacoще б під 3-ку, та під Укр. нац. банк, було б взагалі фешенєбельно

надо глянуть их api, это у меня в тз одним из пунктов было, так что запостил по ходу, можно будет как то и модом реализовать, но я бы лучше сделал как ты на 1.5, где выбрать можно даже банк, с которого тянуть курсы, привязывать наценку...
#4
ALarikглянуть их api,

там xml
#5
Здравствуйте.
В связи с тем, что CMS будут пользоваться из разных стран, есть предложение запилить возможность выбора обновления в зависимости от страны.

Источники для обновления курсов валют с примерами
Украина
https://bank.gov.ua/NBUStatService/v1/statdirectory/exchange?valcode=USD&date=20200305
Беларусь
http://www.nbrb.by/API/ExRates/Rates?Periodicity=0
РФ
http://www.cbr.ru/scripts/XML_daily.asp?date_req=05.03.2020
Казахстан
http://www.nationalbank.kz/rss/get_rates.cfm?fdate=05.03.2020
#6
отличное замечание, поставлю приоритетной задачей в броэктор!
#7
@Baco, если снова затягивается, отпиши, займусь фиксом !

Anyone can read. To post and vote, sign in.