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

ALarik

ALarik

expert
#1
Здравствуйте, други и подруги !
Сегодня покажу небольшой фикс, который позволяет обновлять курс с сайта cbr.ru - тоесть центрального банка РФ для версий ос 2.3, без лишней теории переходим к делу:
открываем файлик, который находим по адресу admin/model/localisation/currency.php, там нас интересует функция:
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');
    }
и заменяем на (уже написанную мастером) вот эту:
PHP:
    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');
    }
сохраняем, заходим на главную панель в админке и проверяем обновленные курсы валют, приятного пользования, жмякаем лойс, если понравилось.
 
Симпатії: Baco
OP
ALarik

ALarik

expert
Thread Starter #3
ще б під 3-ку, та під Укр. нац. банк, було б взагалі фешенєбельно
надо глянуть их api, это у меня в тз одним из пунктов было, так что запостил по ходу, можно будет как то и модом реализовать, но я бы лучше сделал как ты на 1.5, где выбрать можно даже банк, с которого тянуть курсы, привязывать наценку...
 
Denzy

Denzy

Web Шаман
#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
 
Симпатії: Baco
Baco

Baco

architect
#6
отличное замечание, поставлю приоритетной задачей в броэктор!
 
Останнє редагування:
OP
ALarik

ALarik

expert
Thread Starter #7
@Baco, если снова затягивается, отпиши, займусь фиксом !
 
Останнє редагування модератором:
Зверху