Jump to content

Recommended Posts

Столкнулся с такой проблемой, что стандартный функционал обновлений курса валют для Украины немного не подходит. Зачастую курс занижен. С поставщиками оплата производится в USD по курсу ПриватБанка или Межбанка.

Немного покопавшись в API ПриватБанка вышло решение какое подошло.

Выкладываю код, может кому-то пригодится.

 

И так, открываем файл admin/model/localisation/currency.php

Находим функцию:

public function refresh($force = false) {
	if (extension_loaded('curl')) {
		$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) {
	if (extension_loaded('curl')) {
		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'))) . "'");
		}
		
		if (!empty($query->rows)) {
			$curl = curl_init();

			curl_setopt($curl, CURLOPT_URL, 'https://api.privatbank.ua/p24api/pubinfo?json&exchange&coursid=5');
			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 = json_decode($content);
			
			foreach ($lines as $line) {
				$currency = $line->ccy;
				$value = 1/ (float)$line->sale;// (float)$line->buy

				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');
		}
	}
}

Тут единственное нужно учесть, какой курс Вы хотите использовать, Покупки или Продажи валюты и исходя из этого брать параметр: $line->sale или $line->buy

Edited by Fedka
  • +1 5

Share this post


Link to post
Share on other sites

Спасибо-то что искал. Буду пробовать

Share this post


Link to post
Share on other sites
В 03.03.2017 в 04:57, 1san4ik сказал:

Спасибо-то что искал. Буду пробовать

Все реально работает - спасибо тебе добрый человек)

Share this post


Link to post
Share on other sites

Спасибо!

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

А в файле admin/model/localisation/currency.php в выделенном участке меняем "/" на "*"

 

 

1.png

2.png

Edited by Yarcher
замена скрина

Share this post


Link to post
Share on other sites

спсибо, что нужно добавить, чтобы менялись EUR и RUB?

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites
1 час назад, sergio90 сказал:

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

Если стоит "Автоматическое обновление валюты" в настройках магазина, тогда курс обновляется один раз при первом заходе в админку.

Если Вы хотите обновить вручную, тогда перейдите в список валют, и нажмите кнопку "Обновить", она с круговыми стрелочками в верхней правой части

 

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
You are posting as a guest. If you have an account, please sign in.
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


  • Recently Browsing   0 members

    No registered users viewing this page.

×

Important Information

On our site, cookies are used and personal data is processed to improve the user interface. To find out what and what personal data we are processing, please go to the link. If you click "I agree," it means that you understand and accept all the conditions specified in this Privacy Notice.