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

[Поддержка] Обновление курсов валют с ЦБРФ


ikarus

Recommended Posts

  • 9 months later...
  • 5 weeks later...
  • 5 months later...

Попробовал.

Вроде работает, ошибки не вылетают.

Курсы теперь по Центробанку
 
И, да, ikarus,спасибо за полезный мод! :geek:

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


  • 1 month later...

Добрый день.

 

Когда обновляю валюту в админке, то курс рубля обновляется нормально. Курс USD остается в значении 1. А вот курс EUR обновляется до значения 0,894846164 или что-то примерное. Т.е. не устанавливается значение 1. По умолчанию установлена валюта USD.

В чем может быть проблема? Почему EUR постоянно сбивается с значения 1?

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


Почему EUR постоянно сбивается с значения 1?

Потому что:

По умолчанию установлена валюта USD.

Остальные валюты принимают значение по отношению к основной.
  • +1 2
Надіслати
Поділитися на інших сайтах


Потому что:

Остальные валюты принимают значение по отношению к основной.

Так и думал. Но ведь евро стоит дороже, чем доллар. Значит значение евро должно быть больше 1.

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


Но ведь евро стоит дороже, чем доллар.

Именно. Попробую попроще объяснить.

Доллар базовая валюта в Вашем магазине и ее значение равно 1, а остальные валюты после обновления курсов принимают значение достаточное для покупки этой единицы, то есть, на текущий момент для покупки одного доллара нужно 65 рублей или 0.9 евро.

  • +1 2
Надіслати
Поділитися на інших сайтах


Именно. Попробую попроще объяснить.

Доллар базовая валюта в Вашем магазине и ее значение равно 1, а остальные валюты после обновления курсов принимают значение достаточное для покупки этой единицы, то есть, на текущий момент для покупки одного доллара нужно 65 рублей или 0.9 евро.

Вот теперь понятно. Спасибо, что разъяснили.

Последний вопрос: цены, которые я установлю в евро, будут правильно пересчитываются в рубли, с учетом курса?

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


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

Цены должны устанавливаться в базовой валюте, в Вашем случае это доллар, а конвертация происходит при ее переключении на витрине магазина.
  • +1 1
Надіслати
Поділитися на інших сайтах


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

Понял. Еще раз спасибо!

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


  • 4 weeks later...

На шаблоне UniShop не работает способ. На дефолтном все было нормально.

Отписался в теме поддержки шаблона, но может тут кто-нибудь раньше поделится опытом.

 

UPD. Автор шаблона UniShop говорит, что шаблон не затрагивает работу с валютами.

 

В чем может быть проблема?

OcStore 2.1.0.2.1

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


  • 2 months later...
  • 3 months later...
  • 9 months later...
  • 1 month later...

SOS. Перестала работать конвертация.

 

Ошибка Notice: Trying to get property of non-object in /home/a/public_html/admin/model/localisation/currency.php

В строках:

                $nom = intval($icn->item(5)->nodeValue);
                $value = floatval(str_replace(",", "." , $icn->item(9)->nodeValue));
и эта Warning: Division by zero in  в:

 $ret[$code] = ($value/$nom);


Как я понял скрипт чтото не может получить от сюда http://www.cbr.ru/scripts/XML_daily.asp

 

Полный код функции

Спойлер



public function refresh($force = false) {
		$query = $this->db->query("SELECT date_modified FROM " . DB_PREFIX . "currency WHERE code != '" . $this->db->escape($this->config->get('config_currency')) . "'");
	$cc_value = $this->db->query("SELECT value FROM " . DB_PREFIX . "currency WHERE code = '" . $this->db->escape($this->config->get('config_currency')) . "'");
	$i = 0;
	foreach ($query->rows as $mdate) {
		if($this->db->escape(date('Y-m-d',strtotime($mdate['date_modified']))) < $this->db->escape(date('Y-m-d', strtotime('now')))) $i++;
	}
	$manual_update = isset($this->request->post['manual_update']) ? $this->request->post['manual_update'] : false;
	if ($i || $cc_value->row['value'] != 1.00000 || $manual_update)	{
	$url = 'http://www.cbr.ru/scripts/XML_daily.asp';
	$answer = $this->CheckHttpStatus($url);
	if ($answer != 200) {
	/*
	echo '<script type="text/javascript" charset="utf-8">
	alert("Не удалось загрузить файл курсов валют с сайта ЦБРФ! Код статуса ответа сервера: '.$answer.'. URL: '.$url.' . Возможны временные сбои на сервере, попробуйте обновить курсы позже. Дата последнего обновления валют: ' . $ldate["date_modified"] . '");
	</script>';	
	*/
	} else {
	
		if (extension_loaded('curl')) {
			$data = array();
						
			$ch = curl_init();
			curl_setopt($ch, CURLOPT_URL, 'http://www.cbr.ru/scripts/XML_daily.asp');
			curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
			$content = curl_exec($ch);
			curl_close($ch);

			$doc = new DOMDocument();
			$doc->loadXML($content);
			$valute = $doc->getElementsByTagName("Valute");
			
			$cur_val = $this->config->get('config_currency') == 'RUB' ? 'RUB' : $this->config->get('config_currency');
	
			$query = $this->db->query("SELECT * FROM " . DB_PREFIX . "currency WHERE code != '" . $this->db->escape($this->config->get('config_currency')) . "'");

			$ret = array();

			foreach( $valute as $value )
			{
				$icn = $value->childNodes;
				$code = $icn->item(3)->nodeValue;
				$nom = intval($icn->item(5)->nodeValue);
				$value = floatval(str_replace(",", "." , $icn->item(9)->nodeValue));
				$ret[$code] = ($value/$nom);
			}
			
			if ($cur_val == 'RUB') {
			foreach ($query->rows as $result) {
			 if($ret[$result['code']]){
				$value = 1 / $ret[$result['code']];

				if ((float)$value) {
					$this->db->query("UPDATE " . DB_PREFIX . "currency SET value = '" . (float)$value . "', date_modified = NOW() WHERE code = '" . $this->db->escape($result['code']) . "'");
				}
			 }
			}
			
			}
			//евро +3%
			if ($result['code'] == 'EUR') {
				$curs = $ret[$result['code']] * 100.03;
			} else {
				$curs = $ret[$result['code']];
				}
$value = 1 / $curs;
			if ($cur_val != 'RUB') {
			
			foreach ($query->rows as $result) {
			    if($result['code'] == 'RUB') {
				$value = $ret[$cur_val];
				if ((float)$value) {
				    $this->db->query("UPDATE " . DB_PREFIX . "currency SET value = '" . (float)$value . "', date_modified = NOW() WHERE code = 'RUB'");
				}
				} else {
				    $value = $ret[$result['code']];
				    if ((float)$value) {
					$val = (float)$ret[$cur_val] / (float)$value;
				        $this->db->query("UPDATE " . DB_PREFIX . "currency SET value = '" . $val . "', date_modified = NOW() WHERE code = '" . $this->db->escape($result['code']) . "'");
				    }
				}
			}
			}
			
			$this->db->query("UPDATE " . DB_PREFIX . "currency SET value = '1.00000', date_modified = NOW() WHERE code = '" . $this->db->escape($this->config->get('config_currency')) . "'");
			
			$this->cache->delete('currency');

		}
	}
	}
}


 

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


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

SOS. Перестала работать конвертация.

 

Ошибка Notice: Trying to get property of non-object in /home/a/public_html/admin/model/localisation/currency.php

В строках:

                $nom = intval($icn->item(5)->nodeValue);
                $value = floatval(str_replace(",", "." , $icn->item(9)->nodeValue));
и эта Warning: Division by zero in  в:

 $ret[$code] = ($value/$nom);


Как я понял скрипт чтото не может получить от сюда http://www.cbr.ru/scripts/XML_daily.asp

 

Полный код функции

  Показать контент

 



public function refresh($force = false) {
		$query = $this->db->query("SELECT date_modified FROM " . DB_PREFIX . "currency WHERE code != '" . $this->db->escape($this->config->get('config_currency')) . "'");
	$cc_value = $this->db->query("SELECT value FROM " . DB_PREFIX . "currency WHERE code = '" . $this->db->escape($this->config->get('config_currency')) . "'");
	$i = 0;
	foreach ($query->rows as $mdate) {
		if($this->db->escape(date('Y-m-d',strtotime($mdate['date_modified']))) < $this->db->escape(date('Y-m-d', strtotime('now')))) $i++;
	}
	$manual_update = isset($this->request->post['manual_update']) ? $this->request->post['manual_update'] : false;
	if ($i || $cc_value->row['value'] != 1.00000 || $manual_update)	{
	$url = 'http://www.cbr.ru/scripts/XML_daily.asp';
	$answer = $this->CheckHttpStatus($url);
	if ($answer != 200) {
	/*
	echo '<script type="text/javascript" charset="utf-8">
	alert("Не удалось загрузить файл курсов валют с сайта ЦБРФ! Код статуса ответа сервера: '.$answer.'. URL: '.$url.' . Возможны временные сбои на сервере, попробуйте обновить курсы позже. Дата последнего обновления валют: ' . $ldate["date_modified"] . '");
	</script>';	
	*/
	} else {
	
		if (extension_loaded('curl')) {
			$data = array();
						
			$ch = curl_init();
			curl_setopt($ch, CURLOPT_URL, 'http://www.cbr.ru/scripts/XML_daily.asp');
			curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
			$content = curl_exec($ch);
			curl_close($ch);

			$doc = new DOMDocument();
			$doc->loadXML($content);
			$valute = $doc->getElementsByTagName("Valute");
			
			$cur_val = $this->config->get('config_currency') == 'RUB' ? 'RUB' : $this->config->get('config_currency');
	
			$query = $this->db->query("SELECT * FROM " . DB_PREFIX . "currency WHERE code != '" . $this->db->escape($this->config->get('config_currency')) . "'");

			$ret = array();

			foreach( $valute as $value )
			{
				$icn = $value->childNodes;
				$code = $icn->item(3)->nodeValue;
				$nom = intval($icn->item(5)->nodeValue);
				$value = floatval(str_replace(",", "." , $icn->item(9)->nodeValue));
				$ret[$code] = ($value/$nom);
			}
			
			if ($cur_val == 'RUB') {
			foreach ($query->rows as $result) {
			 if($ret[$result['code']]){
				$value = 1 / $ret[$result['code']];

				if ((float)$value) {
					$this->db->query("UPDATE " . DB_PREFIX . "currency SET value = '" . (float)$value . "', date_modified = NOW() WHERE code = '" . $this->db->escape($result['code']) . "'");
				}
			 }
			}
			
			}
			//евро +3%
			if ($result['code'] == 'EUR') {
				$curs = $ret[$result['code']] * 100.03;
			} else {
				$curs = $ret[$result['code']];
				}
$value = 1 / $curs;
			if ($cur_val != 'RUB') {
			
			foreach ($query->rows as $result) {
			    if($result['code'] == 'RUB') {
				$value = $ret[$cur_val];
				if ((float)$value) {
				    $this->db->query("UPDATE " . DB_PREFIX . "currency SET value = '" . (float)$value . "', date_modified = NOW() WHERE code = 'RUB'");
				}
				} else {
				    $value = $ret[$result['code']];
				    if ((float)$value) {
					$val = (float)$ret[$cur_val] / (float)$value;
				        $this->db->query("UPDATE " . DB_PREFIX . "currency SET value = '" . $val . "', date_modified = NOW() WHERE code = '" . $this->db->escape($result['code']) . "'");
				    }
				}
			}
			}
			
			$this->db->query("UPDATE " . DB_PREFIX . "currency SET value = '1.00000', date_modified = NOW() WHERE code = '" . $this->db->escape($this->config->get('config_currency')) . "'");
			
			$this->cache->delete('currency');

		}
	}
	}
}

 

 

 

А если заменить

http://www.cbr.ru/scripts/XML_daily.asp

на

https://www.cbr-xml-daily.ru/daily_utf8.xml

тоже ошибка будет?

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


Только что, vise сказал:

А если заменить

http://www.cbr.ru/scripts/XML_daily.asp

на


https://www.cbr-xml-daily.ru/daily_utf8.xml

тоже ошибка будет?

 

Да, та же ошибка. На 9 разных сайтах. На одном хостинге sweb.ru , но разные аккаунты.

Отвалилось все буквально в конце прошлой недели, до этого 1,5 года работало исправно(( 

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


Только что, thentru сказал:

что выводит phpinfo на предмет наличия DOM?

promo.a-ctroy.ru/phpinfo.php

 

Спойлер

 

dom

DOM/XML enabled
DOM/XML API Version 20031129
libxml Version 2.9.3
HTML Support enabled
XPath Support enabled
XPointer Support enabled
Schema Support enabled
RelaxNG Support enabled

 

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


В общем заменить обработку xml на этот код
 

$ret = array();
        
$xml_object = simplexml_load_string($content);
        
if ($xml_object !== false) {
  foreach ($xml_object->Valute as $currency) {
    $code = (string)$currency->CharCode;
    $nominal = (int)$currency->Nominal;
    $value = str_replace(',', '.', (string)$currency->Value);
                
    $ret[$code] = $nominal / $value;
  }
}

 

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


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

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

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

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

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

Вхід

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

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

Important Information

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