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

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

Змінено користувачем Fedka
  • +1 6
Надіслати
Поділитися на інших сайтах

  • 8 months later...
  • 1 year later...
  • 5 months later...

Спасибо!

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

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

 

 

1.png

2.png

Змінено користувачем Yarcher
замена скрина
Надіслати
Поділитися на інших сайтах


  • 1 year later...
  • 3 weeks later...
1 час назад, sergio90 сказал:

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

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

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

 

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

  • 4 months later...

Сделал так...Может пригодиться кому. Меняю курс прямо в базе данных планировщиком хостинга. У меня доллар по умолчанию.

файл PHP с таким текстом, кидаю в корень сайта и натравливаю на него планировщик.

 

<?php

// Подключение к БД
include 'config.php';
$dbhost = DB_HOSTNAME;
$dbuser = DB_USERNAME;
$dbpass = DB_PASSWORD;
$dbname = DB_DATABASE;
$sqlchar='utf8';
 
 
$db = new PDO ( 'mysql:host=' . $dbhost . ';dbname=' . $dbname, $dbuser, $dbpass);
$db->query ( 'SET character_set_connection = '.$sqlchar );
$db->query ( 'SET character_set_client = '.$sqlchar );
$db->query ( 'SET character_set_results = '.$sqlchar );
 
$xml = simplexml_load_file('https://api.privatbank.ua/p24api/pubinfo?exchange&coursid=5');
$p=$xml->xpath('//exchangerate[@ccy="USD"]');
$z=$p[0]->attributes()->sale;

$date=date('Y-m-d H:i:s');
    $db->exec("UPDATE `oc_currency` SET `value`= $z,`date_modified`= '$date' WHERE `code`= 'UAH'");

echo 'Курс обновился в ('. $date .')';
   
?>

 

 

 

 

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


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

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

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

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

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

Вхід

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

Вхід зараз
  • Зараз на сторінці   0 користувачів

    • Ні користувачів, які переглядиють цю сторінку

×
×
  • Створити...

Important Information

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