Перейти до вмісту
Пошук в
  • Детальніше...
Шукати результати, які ...
Шукати результати в ...

Обновление курсов валют NBRB (Национальный банк РБ) nbrb.by


deman696

Recommended Posts

все что попадалось на глаза по этой теме, относительно дано перестало быть актуальным, вот решил немного освежить... уверен что если мне актуален этот вопрос, то тема еще жива))) и будут еще единомышленники которым этот вопрос тоже актуален.
 

1. сначала устанавливаем Currency Rates Fix он будет обновлять ваши курсы валют ежедневно

2. далее редактируем несколько файлов, внося туда nbrb.by

  • admin/view/template/extension/module/currency_update.twig
Спойлер

{{ header }}{{ column_left }}
<div id="content">
  <div class="page-header">
    <div class="container-fluid">
      <div class="pull-right">
        <a href="{{ update }}" onClick="$(this).text('{{ text_loading }}');" data-toggle="tooltip" title="{{ button_update }}" class="btn btn-warning"><i class="fa fa-refresh"></i></a>
        <button type="submit" form="form-module" data-toggle="tooltip" title="{{ button_save }}" class="btn btn-primary"><i class="fa fa-save"></i></button>
        <a href="{{ cancel }}" data-toggle="tooltip" title="{{ button_cancel }}" class="btn btn-default"><i class="fa fa-reply"></i></a>
      </div>
      <h1>{{ heading_title }}</h1>
      <ul class="breadcrumb">
        {% for breadcrumb in breadcrumbs %}
          <li><a href="{{ breadcrumb.href }}">{{ breadcrumb.text }}</a></li>
        {% endfor %}
      </ul>
    </div>
  </div>
  <div class="container-fluid">
    {% if error_success %}
      <div class="alert alert-success alert-dismissible"><i class="fa fa-exclamation-circle"></i> {{ error_success }}
        <button type="button" class="close" data-dismiss="alert">&times;</button>
      </div>
    {% endif %}
    {% if error_warning %}
      <div class="alert alert-danger alert-dismissible"><i class="fa fa-exclamation-circle"></i> {{ error_warning }}
        <button type="button" class="close" data-dismiss="alert">&times;</button>
      </div>
    {% endif %}
    <div class="panel panel-default">
      <div class="panel-heading">
        <h3 class="panel-title"><i class="fa fa-pencil"></i> {{ text_edit }}</h3>
      </div>
      <div class="panel-body">
        <form action="{{ action }}" method="post" enctype="multipart/form-data" id="form-module" class="form-horizontal">
          <div class="form-group">
            <label class="col-sm-2 control-label" for="entry-autoupdate"><span data-toggle="tooltip" title="{{ help_autoupdate }}">{{ entry_autoupdate }}</span></label>
            <div class="col-sm-10">
              <select name="module_currency_update_autoupdate" id="input-autoupdate" class="form-control">
                <option value="1"{{ module_currency_update_autoupdate ? ' selected="selected"' : '' }}>{{ text_enabled }}</option>
                <option value="0"{{ module_currency_update_autoupdate ? '' : ' selected="selected"' }}>{{ text_disabled }}</option>
              </select>
            </div>
          </div>
          <div class="form-group">
            <label class="col-sm-2 control-label" for="entry-comission"><span data-toggle="tooltip" title="{{ help_comission }}">{{ entry_comission }}</span></label>
            <div class="col-sm-10">
              <input name="module_currency_update_comission" id="input-comission" value="{{ module_currency_update_comission }}"  class="form-control" />
              {% if error_comission %}
                <div class="text-danger">{{ error_comission }}</div>
              {% endif %}
            </div>
          </div>
          <div class="form-group">
            <label class="col-sm-2 control-label" for="entry-source"><span data-toggle="tooltip" title="{{ help_source }}">{{ entry_source }}</span></label>
            <div class="col-sm-10">
              <select name="module_currency_update_source" id="input-source" class="form-control">
                <option value="alphavantage.co"{{ module_currency_update_source == 'alphavantage.co' ? ' selected="selected"' : '' }}>{{ text_source_alphavantage }}</option>
                <option value="fixer.io"{{ module_currency_update_source == 'fixer.io' ? ' selected="selected"' : '' }}>{{ text_source_fixer }}</option>
                <option value="xe.com"{{ module_currency_update_source == 'xe.com' ? ' selected="selected"' : '' }}>{{ text_source_xe }}</option>
                <option value="nbrb.by"{{ module_currency_update_source == 'nbrb.by' ? ' selected="selected"' : '' }}>{{ text_source_nbrb }}</option>
              </select>
            </div>
          </div>
          <div class="form-group optional" data-source="alphavantage.co"{{ module_currency_update_source == 'alphavantage.co' ? '' : ' style="display:none;"' }}>
            <label class="col-sm-2 control-label" for="input-alphavantage-api-key"><span data-toggle="tooltip" title="{{ help_alphavantage_api_key }}">{{ entry_alphavantage_api_key }}</span></label>
            <div class="col-sm-6">
              <input name="module_currency_update_alphavantage_api_key" value="{{ module_currency_update_alphavantage_api_key }}" id="input-alphavantage-api-key" class="form-control" />
              {% if error_alphavantage_api_key %}
                <div class="text-danger">{{ error_alphavantage_api_key }}</div>
              {% endif %}
            </div>
            <div class="col-sm-4">
              <div class="alert alert-info alert-dismissible" style="margin:0;padding:8px 10px 8px 10px;"><i class="fa fa-exclamation-circle"></i> {{ text_alphavantage_api_key }}</div>
            </div>
          </div>
          <div class="form-group optional" data-source="fixer.io"{{ module_currency_update_source == 'fixer.io' ? '' : ' style="display:none;"' }}>
            <label class="col-sm-2 control-label" for="input-fixer-api-key"><span data-toggle="tooltip" title="{{ help_fixer_api_key }}">{{ entry_fixer_api_key }}</span></label>
            <div class="col-sm-6">
              <input name="module_currency_update_fixer_api_key" value="{{ module_currency_update_fixer_api_key }}" id="input-fixer-api-key" class="form-control" />
              {% if error_fixer_api_key %}
                <div class="text-danger">{{ error_fixer_api_key }}</div>
              {% endif %}
            </div>
            <div class="col-sm-4">
              <div class="alert alert-info alert-dismissible" style="margin:0;padding:8px 10px 8px 10px;"><i class="fa fa-exclamation-circle"></i> {{ text_fixer_api_key }}</div>
            </div>
          </div>
          <div class="form-group">
            <label class="col-sm-2 control-label" for="input-debug">{{ entry_debug }}</label>
            <div class="col-sm-10">
              <select name="module_currency_update_debug" id="input-debug" class="form-control">
                <option value="1"{{ module_currency_update_debug ? ' selected="selected"' : '' }}>{{ text_enabled }}</option>
                <option value="0"{{ module_currency_update_debug ? '' : ' selected="selected"' }}>{{ text_disabled }}</option>
              </select>
            </div>
          </div>
          <div class="form-group">
            <label class="col-sm-2 control-label" for="input-status">{{ entry_status }}</label>
            <div class="col-sm-10">
              <select name="module_currency_update_status" id="input-status" class="form-control">
                <option value="1"{{ module_currency_update_status ? ' selected="selected"' : '' }}>{{ text_enabled }}</option>
                <option value="0"{{ module_currency_update_status ? '' : ' selected="selected"' }}>{{ text_disabled }}</option>
              </select>
            </div>
          </div>
        </form>
      </div>
    </div>
  </div>
</div>
<script type="text/javascript">
  $('select[name="module_currency_update_source"]').on('change', function() {
    var sel = $('option:selected', $(this)).val();
    $('.optional[data-source!="'+sel+'"]').hide();
    $('.optional[data-source="'+sel+'"]').show();
  });
</script>
{{ footer }}

 

  • admin/language/en-gb/extension/module/currency_update.php
Спойлер

<?php
// Heading
$_['heading_title']           = 'Currency Update';

// Text
$_['text_extension']          = 'Extensions';
$_['text_success']            = 'Success: You have modified currency update module!';
$_['text_update_success']        = 'Success: You have updated currencies!';
$_['text_update_error']          = 'Warning: Currency update failed!';
$_['text_edit']               = 'Edit Currency Update Module';
$_['text_source_alphavantage']   = 'alphavantage.co';
$_['text_source_fixer']         = 'fixer.io (recommended)';
$_['text_source_xe']            = 'xe.com';
$_['text_source_nbrb']              = 'nbrb.by';
$_['text_alphavantage_api_key']  = 'Get the API key <a target="_blank" href="https://www.alphavantage.co/support/#api-key">here</a>.';
$_['text_fixer_api_key']  = 'Get the API key <a target="_blank" href="https://www.fixer.co/support/#api-key">here</a>.';

// Entry
$_['entry_status']               = 'Status';
$_['entry_source']               = 'Source';
$_['entry_autoupdate']           = 'Auto Update';
$_['entry_comission']            = 'Exchange Comission';
$_['entry_debug']                = 'Debug';
$_['entry_alphavantage_api_key'] = 'API key';
$_['entry_fixer_api_key'] = 'API key';

// Help
$_['help_source']                = 'Source of the currency information. If one isnt working, try another';
$_['help_autoupdate']            = 'Enable to update automatically once a day when you login to admin.';
$_['help_comission']             = 'Apply comission to exchange rate, value represents percentage.';
$_['help_fixer_api_key']  = 'The service is free but you must get an API key to use it.';
$_['help_alphavantage_api_key']  = 'The service is free but you must get an API key to use it.';

// Button
$_['button_update']              = 'Update Currencies Now';

// Error
$_['error_permission']           = 'Warning: You do not have permission to modify currency update module!';
$_['error_fixer_api_key'] = 'You must set the API key!';
$_['error_alphavantage_api_key'] = 'You must set the API key!';
$_['error_comission']            = 'Comission must be a percentage value, example : 2.5';

 

  • admin/model/extension/module/currency_update.php
Спойлер

<?php
class ModelExtensionModuleCurrencyUpdate extends Model {

    protected $log_instance;

    public function __construct($registry) {
        parent::__construct($registry);

        error_reporting(-1);
        ini_set('display_errors', 1);
        $this->log_instance = new Log('currency_update.log');
    }

    public function update($force = false) {

        if ($this->config->get('module_currency_update_status') == 0) {
            return false;
        }

        if ($this->config->get('module_currency_update_autoupdate') == 1 || $force) {

            $comission = $this->config->get('module_currency_update_comission') > 0 ? (float) $this->config->get('module_currency_update_comission') / 100 : false;
            $base_currency = $this->config->get('config_currency');

            $sql = "SELECT * FROM " . DB_PREFIX . "currency WHERE code != '" . $this->db->escape($this->config->get('config_currency')) . "'";

            if (!$force) {
                $sql .= " AND date_modified < '" .  $this->db->escape(date('Y-m-d H:i:s', strtotime('-1 day'))) . "'";
            }

            $query = $this->db->query($sql);

            $currency_codes = array();
            $rates = array();

            foreach ($query->rows as $result) {
                $currency_codes[] = $result['code'];
                $rates[$result['code']] = 1;
            }


            // nbrb.by
            if ($this->config->get('module_currency_update_source') == 'nbrb.by') {


                $d = new DateTime();
                $response = $this->curlRequest("http://www.nbrb.by/Services/XmlExRates.aspx?ondate=" . $d->format('m/d/Y'));

                if ($response) {
                    $currenciesRF = simplexml_load_string($response);

                    /* Ошибка выходим */
                    if (!$currenciesRF || count($currenciesRF) == 0) {
                        return false;
                    }


                    foreach ($currenciesRF as $currency) {
                        $rates[(string)$currency->CharCode] = (string)$currency->Rate / (string)$currency->Scale;
                    }


                    foreach ($rates as $code => $val) {
                        if ($code != $base_currency) {
                            $rates[$code] = $rates[$base_currency] / $val;
                        }
                    }
                    foreach ($rates as $code => $value) {
                        $value_ = $comission ? (float)$rates[$code] + ((float)$rates[$code] * $comission) : $rates[$code];
                        $this->db->query("UPDATE " . DB_PREFIX . "currency SET value = '" . $this->db->escape($value_) . "', date_modified = '" . $this->db->escape(date('Y-m-d H:i:s')) . "' WHERE code = '" . $this->db->escape($code) . "'");
                    }



                    //$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($base_currency) . "'");
                } else {
                    return false;
                }
            }




            // fixer.io
            if ($this->config->get('module_currency_update_source') == 'fixer.io') {

                $api_key = $this->config->get('module_currency_update_fixer_api_key');
                $response = $this->curlRequest('http://data.fixer.io/api/latest?access_key='.$api_key.'&base='.$base_currency.'&symbols='.implode(',', $currency_codes));

                if ($response) {
                    $json = json_decode($response);

                    foreach ($currency_codes as $code) {
                        $value = $comission ? (float) $json->rates->{$code} + ((float) $json->rates->{$code} * $comission) : $json->rates->{$code};
                        $this->db->query("UPDATE " . DB_PREFIX . "currency SET value = '" . $this->db->escape($value) . "', date_modified = '" .  $this->db->escape(date('Y-m-d H:i:s')) . "' WHERE code = '" . $this->db->escape($code) . "'");
                    }

                    $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($base_currency) . "'");
                } else {
                    return false;
                }

                // alphavantage.co
            } elseif ($this->config->get('module_currency_update_source') == 'alphavantage.co') {

                $api_key = $this->config->get('module_currency_update_alphavantage_api_key');

                foreach ($currency_codes as $code) {
                    $response = $this->curlRequest('https://www.alphavantage.co/query?function=CURRENCY_EXCHANGE_RATE&from_currency='.$base_currency.'&to_currency='.$code.'&apikey='.$api_key);

                    if ($response) {
                        $json = json_decode($response);

                        if (@is_null($json->{"Error Message"})) {
                            $value = (float) $json->{"Realtime Currency Exchange Rate"}->{"5. Exchange Rate"};
                            $value = $comission ? $value + ($value * $comission) : $value;
                            $this->db->query("UPDATE " . DB_PREFIX . "currency SET value = '" . $this->db->escape($value) . "', date_modified = '" .  $this->db->escape(date('Y-m-d H:i:s')) . "' WHERE code = '" . $this->db->escape($code) . "'");
                        } else {
                            $this->log('alphavantage error : '.$json->{"Error Message"});
                            return false;
                        }
                    } else {
                        return false;
                    }
                }

                $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($base_currency) . "'");

                // xe.com
            } elseif ($this->config->get('module_currency_update_source') == 'xe.com') {

                foreach ($currency_codes as $code) {
                    $response = $this->curlRequest('http://xe.com/currencyconverter/convert.cgi?template=pca-new&Amount=1&From='.$base_currency.'&To='.$code.'&image.x=64&image.y=8&image=Submit');

                    if ($response) {
                        $dom = new DomDocument();
                        $internalErrors = libxml_use_internal_errors(true);
                        $dom->loadHTML($response);
                        $xpath = new DomXPath($dom);
                        $nodes = $xpath->query('//span[@class="XEenlarge"]');

                        $value = (float) trim(str_replace(array($code, ','), '', $nodes->item(2)->nodeValue));

                        $value = $comission ? $value + ($value * $comission) : $value;
                        $this->db->query("UPDATE " . DB_PREFIX . "currency SET value = '" . $this->db->escape($value) . "', date_modified = '" .  $this->db->escape(date('Y-m-d H:i:s')) . "' WHERE code = '" . $this->db->escape($code) . "'");

                        libxml_use_internal_errors($internalErrors);
                    } else {
                        $this->log('xe.com error : no response from curl');
                        return false;
                    }
                }

                $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($base_currency) . "'");
            } else {
                return false;
            }

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

            return true;
        }
    }

    private function curlRequest($url, $options = array()) {

        $this->log('Curl init : '.$url);

        $ch = curl_init();

        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

        $result = curl_exec($ch);
        $info = curl_getinfo($ch);

        if (curl_error($ch)) {
            $this->log('Curl error : '.curl_error($ch));
            return false;
        }

        if (in_array($info['http_code'], array(401,403,404))) {
            $this->log('Curl error : '.$info['http_code'].' header status');
            return false;
        }

        return $result;
    }

    private function log($str) {
        if ($this->config->get('module_currency_update_debug') == 1) {
            $this->log_instance->write($str);
        }
    }

}

 

3. далее идем Система>Локализация>Валюта, создаем валюту BYN, включаем её

4. поле этого в настойках CurrencyUpdate, по идее должно появится nbrb.by, в выпадающем меню Source.

 

Но не появляется( у меня бьет ошибку "currency_update.php on line 94Notice" че с ней делать хз, надеюсь на коллективный разум)))

 

значения курсов должно браться вроде как от сюда

 

P.S. в коде не шарю, только азы начал изучать, знаю что есть готовые решения, но интересно и самому поковыряться ))

 

Надіслати
Поділитися на інших сайтах


31 минуту назад, ashap сказал:

nbrb.by есть тут если ковыряться раздумаете

 

1 час назад, deman696 сказал:

знаю что есть готовые решения

 

спасибо, я умею пользоваться поиском, и если бы понадобилось я бы все же предпочел бы другой модуль вашему)

никаких претензий не имею, каждый зарабатывает как может и умеет.

 

а освеженная тема пусть повисит, мне для моего проекта это вообще не обязательно, задался вопросом чисто по фану, возможно тут в комьюнити найдутся еще такие же))) буду наедятся.

Надіслати
Поділитися на інших сайтах


58 минут назад, deman696 сказал:

 

 

спасибо, я умею пользоваться поиском, и если бы понадобилось я бы все же предпочел бы другой модуль вашему)

никаких претензий не имею, каждый зарабатывает как может и умеет.

 

а освеженная тема пусть повисит, мне для моего проекта это вообще не обязательно, задался вопросом чисто по фану, возможно тут в комьюнити найдутся еще такие же))) буду наедятся.

 

поиском вы пользоваться не умеете, ошибку свою не ищите потому что

писать честно надо - сделайте за меня

а если интересно разобраться, то и надо разбираться а не пеленки выкладывать^ разобраться что такое notice^ как он возникает, что это такое - все в поиске есть которым как вы заявляете пользоваться умеете

и у вас, то актуален вопрос (и для других тоже актуален(для тех кому актуален давно использовали мой модуль), раз вам актуален), потом уже для проекта это вообще не обязательно (наверно и другим уже не обязательно теперь), вы уж определитесь

 

найдутся обязательно в комьюнити те кто тоже не в курсе как сделать так же как и вы, а читать ваш код(вот весь что вы выложили) будет только тот кто разбирается и у него сегодня хорошее настроение)

для начала полный текст ошибки всегда пишите и строчку на которой эта ошибка возникает только из этих данных можно чтото сказать, а то много все выложили , а самого важного и нет

ну и там за вас все равно придется делать, будут новые проблемы в контроллере судя потому что вы туда написали

Надіслати
Поділитися на інших сайтах

Створіть аккаунт або увійдіть для коментування

Ви повинні бути користувачем, щоб залишити коментар

Створити обліковий запис

Зареєструйтеся для отримання облікового запису. Це просто!

Зареєструвати аккаунт

Вхід

Уже зареєстровані? Увійдіть тут.

Вхід зараз
×
×
  • Створити...

Important Information

На нашому сайті використовуються файли cookie і відбувається обробка деяких персональних даних користувачів, щоб поліпшити користувальницький інтерфейс. Щоб дізнатися для чого і які персональні дані ми обробляємо перейдіть за посиланням . Якщо Ви натиснете «Я даю згоду», це означає, що Ви розумієте і приймаєте всі умови, зазначені в цьому Повідомленні про конфіденційність.