0 Пользователей и 1 Гость просматривают эту тему.
  • 15 Ответов
  • 2593 Просмотров
*

festLethal

  • Захожу иногда
  • 64
  • 1 / 0
Курсы валют с ЦБР
« : 23.10.2012, 12:25:32 »
Обыскал уже пол интернета, не могу найти решения для ВМ2. Не верю, что никто не делал ещё подобное. Нужно, чтобы все цены на сайте пересчитывались в соответствии с курсом ЦБР, а не как щас с европейского.

Очень надеюсь на помощь форума.
*

mogutov666

  • Осваиваюсь на форуме
  • 29
  • 2 / 3
Re: Курсы валют с ЦБР
« Ответ #1 : 23.10.2012, 16:31:07 »
делал кто или не делал, но у меня на одном из сайтов есть информер курса валют который берёт их с РБК.
*

festLethal

  • Захожу иногда
  • 64
  • 1 / 0
Re: Курсы валют с ЦБР
« Ответ #2 : 24.10.2012, 03:23:32 »
делал кто или не делал, но у меня на одном из сайтов есть информер курса валют который берёт их с РБК.
Информер валют это ожно,а  чтобы курс валют пересчитывался для всех цен виртуа марта - это немного другое
*

beliyadm

  • Легенда
  • 9512
  • 1650 / 65
  • Севастополь == Россия
Re: Курсы валют с ЦБР
« Ответ #3 : 24.10.2012, 03:26:21 »
Нужно, чтобы все цены на сайте пересчитывались в соответствии с курсом ЦБР
Эт просто, поправить путь к считываемому файлу XML и просмотреть формат, если он другой
Смотрим administrator\components\com_virtuemart\classes\currency\convertECB.php
Он берет данные с http://www.ecb.int/stats/eurofxref/eurofxref-daily.xml
сравнить формат, поправить и в путь
Все истины, которые я хочу вам изложить, — бесстыдная ложь. Записки нетрезвого кодера
Skype: beliyadm_pb
*

festLethal

  • Захожу иногда
  • 64
  • 1 / 0
Re: Курсы валют с ЦБР
« Ответ #4 : 24.10.2012, 05:17:45 »
Эт просто, поправить путь к считываемому файлу XML и просмотреть формат, если он другой
Смотрим administrator\components\com_virtuemart\classes\currency\convertECB.php
Он берет данные с http://www.ecb.int/stats/eurofxref/eurofxref-daily.xml
сравнить формат, поправить и в путь

Если можете подскажите как сделать правильно, буду очень благодарен, сижу 5ый день над этой проблемой. Нашел в интернете сервис http://ce-rates.info/cbr2ecbformat.cgi с аналогичной структурой файла.

Поменял:
var $document_address = 'http://www.ecb.int/stats/eurofxref/eurofxref-daily.xml';
На:
var $document_address = 'http://ce-rates.info/cbr2ecbformat.cgi';

Я не слишком силен в php, знаю только основы. Расширение разное у файлов, но структура одна. будет ли так работать? Сейчас магазин находится ан локал хосте, не знаю будет ли он обновлять с  этого сайта, если мой сайт пока ещё не в сети.
*

beliyadm

  • Легенда
  • 9512
  • 1650 / 65
  • Севастополь == Россия
Re: Курсы валют с ЦБР
« Ответ #5 : 24.10.2012, 05:51:51 »
Минуту, я последний раз с ним (виртом 1.9) работал неделю назад, читал файл daily_rcb.xml по умолчанию
Принцип был прост
Код: php
	jimport('joomla.filesystem.file');
     jimport('joomla.application.application');
$dailyxml_url = JPATH_CACHE . DS .'daily_rcb.xml';
        if (JFile::exists($dailyxml_url)) {
$usd = dailyxml_parser($dailyxml_url, 'USD');
$eur = dailyxml_parser($dailyxml_url, 'EUR');
        } else {
         echo 'not exist daily_rcb.xml';
        }
Что - в 2.0 по дефолту теперь курс евробанка, не нашего РЦБ?
Все истины, которые я хочу вам изложить, — бесстыдная ложь. Записки нетрезвого кодера
Skype: beliyadm_pb
*

festLethal

  • Захожу иногда
  • 64
  • 1 / 0
Re: Курсы валют с ЦБР
« Ответ #6 : 24.10.2012, 06:55:29 »
Минуту, я последний раз с ним (виртом 1.9) работал неделю назад, читал файл daily_rcb.xml по умолчанию
Принцип был прост
Код: php
	jimport('joomla.filesystem.file');
     jimport('joomla.application.application');
$dailyxml_url = JPATH_CACHE . DS .'daily_rcb.xml';
        if (JFile::exists($dailyxml_url)) {
$usd = dailyxml_parser($dailyxml_url, 'USD');
$eur = dailyxml_parser($dailyxml_url, 'EUR');
        } else {
         echo 'not exist daily_rcb.xml';
        }
Что - в 2.0 по дефолту теперь курс евробанка, не нашего РЦБ?

Да в 2.0 теперь берет с европейского банка
код файла convertECB.php теперь выглядит следующим образом:

Код
<?php
if( !defined( '_JEXEC' ) ) die( 'Direct Access to '.basename(__FILE__).' is not allowed.' );

/**
 * This class uses the currency rates provided by an XML file from the European Central Bank
 * Requires [url=http://ru.wikipedia.org/wiki/CURL]cURL[/url] or allow_url_fopen
 */
class convertECB {

// var $archive = true;
// var $last_updated = '';

var $document_address = 'http://www.ecb.int/stats/eurofxref/eurofxref-daily.xml';

var $info_address = 'http://www.ecb.int/stats/eurofxref/';
var $supplier = 'European Central Bank';

/**
* Converts an amount from one currency into another using
* the rate conversion table from the European Central Bank
*
* @param float $amountA
* @param string $currA defaults to $vendor_currency
* @param string $currB defaults to
* @return mixed The converted amount when successful, false on failure
*/
// function convert( $amountA, $currA='', $currB='', $a2b = true ) {
function convert( $amountA, $currA='', $currB='', $a2rC = true, $relatedCurrency = 'EUR') {

// cache subfolder(group) 'convertECB', cache method: callback
$cache= JFactory::getCache('convertECB','callback');

// save configured lifetime
@$lifetime=$cache->lifetime;

$cache->setLifeTime(86400/4); // check 4 time per day

// save cache conf

$conf = JFactory::getConfig();

// check if cache is enabled in configuration

$cacheactive = $conf->getValue('config.caching');

$cache->setCaching(1); //enable caching

$globalCurrencyConverter = $cache->call( array( 'convertECB', 'getSetExchangeRates' ),$this->document_address );

// revert configuration

$cache->setCaching($cacheactive);


if(!$globalCurrencyConverter ){
//vmdebug('convert convert No $globalCurrencyConverter convert '.$amountA);
return $amountA;
} else {
$valA = isset( $globalCurrencyConverter[$currA] )? $globalCurrencyConverter[$currA] : 1.0;
$valB = isset( $globalCurrencyConverter[$currB] )? $globalCurrencyConverter[$currB] : 1.0;

$val = (float)$amountA * (float)$valB / (float)$valA;
//vmdebug('convertECB with '.$currA.' '.$amountA.' * '.$valB.' / '.$valA.' = '.$val,$globalCurrencyConverter[$currA]);

return $val;
}
}

static function getSetExchangeRates($ecb_filename){

$archive = true;
setlocale(LC_TIME, "en-GB");
$now = time() + 3600; // Time in ECB (Germany) is GMT + 1 hour (3600 seconds)
if (date("I")) {
$now += 3600; // Adjust for daylight saving time
}
$weekday_now_local = gmdate('w', $now); // week day, important: week starts with sunday (= 0)!!
$date_now_local = gmdate('Ymd', $now);
$time_now_local = gmdate('Hi', $now);
$time_ecb_update = '1415';
if( is_writable(JPATH_BASE.DS.'cache') ) {
$store_path = JPATH_BASE.DS.'cache';
}
else {
$store_path = JPATH_SITE.DS.'media';
}

$archivefile_name = $store_path.'/daily.xml';

$val = '';


if(file_exists($archivefile_name) && filesize( $archivefile_name ) > 0 ) {
// timestamp for the Filename
$file_datestamp = date('Ymd', filemtime($archivefile_name));

// check if today is a weekday - no updates on weekends
if( date( 'w' ) > 0 && date( 'w' ) < 6
// compare filedate and actual date
&& $file_datestamp != $date_now_local
// if localtime is greater then ecb-update-time go on to update and write files
&& $time_now_local > $time_ecb_update) {
$curr_filename = $ecb_filename;
}
else {
$curr_filename = $archivefile_name;
$last_updated = $file_datestamp;
$archive = false;
}
}
else {
$curr_filename = $ecb_filename;
}

if( !is_writable( $store_path )) {
$archive = false;
vmError( "The file $archivefile_name can't be created. The directory $store_path is not writable" );
}
// JError::raiseNotice(1, "The file $archivefile_name should be in the directory $store_path " );
if( $curr_filename == $ecb_filename ) {
// Fetch the file from the internet
if(!class_exists('VmConnector')) require(JPATH_VM_ADMINISTRATOR.DS.'helpers'.DS.'connection.php');
// JError::raiseNotice(1, "Updating currency " );
if (!$contents = VmConnector::handleCommunication( $curr_filename )) {
if (isset($file_datestamp)) {
$contents = @file_get_contents( $curr_filename );
}
} else $last_updated = date('Ymd');

}
else {
$contents = @file_get_contents( $curr_filename );
}
if( $contents ) {
// if archivefile does not exist
if( $archive ) {
// now write new file
file_put_contents( $archivefile_name, $contents );
}

$contents = str_replace ("<Cube currency='USD'", " <Cube currency='EUR' rate='1'/> <Cube currency='USD'", $contents);

/* XML Parsing */
$xmlDoc = new DomDocument();

if( !$xmlDoc->loadXML($contents) ) {
//todo
vmError('Failed to parse the Currency Converter XML document.');
vmError('The content: '.$contents);
// $GLOBALS['product_currency'] = $vendor_currency;
return false;
}

$currency_list = $xmlDoc->getElementsByTagName( "Cube" );
// Loop through the Currency List
$length = $currency_list->length;
for ($i = 0; $i < $length; $i++) {
$currNode = $currency_list->item($i);
if(!empty($currNode) && !empty($currNode->attributes->getNamedItem("currency")->nodeValue)){
$currency[$currNode->attributes->getNamedItem("currency")->nodeValue] = $currNode->attributes->getNamedItem("rate")->nodeValue;
unset( $currNode );
}

}
$globalCurrencyConverter = $currency;
}
else {
$globalCurrencyConverter = false;
vmError( 'Failed to retrieve the Currency Converter XML document.');
// return false;
}

return $globalCurrencyConverter;
}

}
// pure php no closing tag

« Последнее редактирование: 24.10.2012, 06:59:54 от festLethal »
*

beliyadm

  • Легенда
  • 9512
  • 1650 / 65
  • Севастополь == Россия
Re: Курсы валют с ЦБР
« Ответ #7 : 24.10.2012, 07:21:12 »
Не знаю как там было, но вот вам рабочий код, самопал, но для небольших сайтов потянет
Код: php
        
        /*
        Сохранить http://www.cbr.ru/scripts/XML_daily.asp локально в modules\mod_course\cache
        С именем текущей даты. При загрузке модуля проверить совпадение даты, если нет - прочитать с ЦБ заново, удалить старый, сохранить новый
        Потом парсер
        */

        $dailyxml = date('dmY');
        $dailyxml_url = JPATH_CACHE . DS . $dailyxml.'_daily.xml';
        if (JFile::exists($dailyxml_url)) {
        // файл уже есть, значит парсим, функция
        $usd = dailyxml_parser($dailyxml_url, 'USD');
        $eur = dailyxml_parser($dailyxml_url, 'EUR');
        } else {
        // файла нет, значит удалим файл за вчера, создадим и функция парсим
            $dailyxml_url_old = JPATH_CACHE . DS . date('dmY', time()-86400).'_daily.xml';
        JFile::delete($dailyxml_url_old);
        // новый файл
        $date = date('d/m/Y');
        $link = 'http://www.cbr.ru/scripts/XML_daily.asp?date_req='.$date;
        $fd = fopen($link, 'r');
    $dailyxml_text = '';
    if (!$fd) {
    echo 'error page www.cbr.ru/scripts/XML_daily.asp';
    } else {
        while (!feof ($fd)) $dailyxml_text .= fgets($fd, 4096);
    }
    fclose ($fd);
    // грабим текст в файл
    $dailyxml_url = JPATH_CACHE . DS . $dailyxml.'_daily.xml';
    JFile::write($dailyxml_url, $dailyxml_text);
    // получаем курс
    $usd = dailyxml_parser($dailyxml_url, 'USD');
            $eur = dailyxml_parser($dailyxml_url, 'EUR');
    }

Но мне кажется, что у вирта 2.0 есть проще пути, тут я с нуля граблю ХМЛ с центробанка, храню данные сутки, проверяю при заходе в фронта (неоптимально при больших нагрузках)
Все истины, которые я хочу вам изложить, — бесстыдная ложь. Записки нетрезвого кодера
Skype: beliyadm_pb
*

festLethal

  • Захожу иногда
  • 64
  • 1 / 0
Re: Курсы валют с ЦБР
« Ответ #8 : 24.10.2012, 07:31:43 »
Не знаю как там было, но вот вам рабочий код, самопал, но для небольших сайтов потянет
Код: php
        
        /*
        Сохранить http://www.cbr.ru/scripts/XML_daily.asp локально в modules\mod_course\cache
        С именем текущей даты. При загрузке модуля проверить совпадение даты, если нет - прочитать с ЦБ заново, удалить старый, сохранить новый
        Потом парсер
        */

        $dailyxml = date('dmY');
        $dailyxml_url = JPATH_CACHE . DS . $dailyxml.'_daily.xml';
        if (JFile::exists($dailyxml_url)) {
        // файл уже есть, значит парсим, функция
        $usd = dailyxml_parser($dailyxml_url, 'USD');
        $eur = dailyxml_parser($dailyxml_url, 'EUR');
        } else {
        // файла нет, значит удалим файл за вчера, создадим и функция парсим
            $dailyxml_url_old = JPATH_CACHE . DS . date('dmY', time()-86400).'_daily.xml';
        JFile::delete($dailyxml_url_old);
        // новый файл
        $date = date('d/m/Y');
        $link = 'http://www.cbr.ru/scripts/XML_daily.asp?date_req='.$date;
        $fd = fopen($link, 'r');
    $dailyxml_text = '';
    if (!$fd) {
    echo 'error page www.cbr.ru/scripts/XML_daily.asp';
    } else {
        while (!feof ($fd)) $dailyxml_text .= fgets($fd, 4096);
    }
    fclose ($fd);
    // грабим текст в файл
    $dailyxml_url = JPATH_CACHE . DS . $dailyxml.'_daily.xml';
    JFile::write($dailyxml_url, $dailyxml_text);
    // получаем курс
    $usd = dailyxml_parser($dailyxml_url, 'USD');
            $eur = dailyxml_parser($dailyxml_url, 'EUR');
    }

Но мне кажется, что у вирта 2.0 есть проще пути, тут я с нуля граблю ХМЛ с центробанка, храню данные сутки, проверяю при заходе в фронта (неоптимально при больших нагрузках)


Пишет 8(
Fatal error: Call to undefined function dailyxml_parser() in X:\home\localhost\www\Kond\administrator\components\com_virtuemart\plugins\currency_converter\convertECB.php on line 12
*

beliyadm

  • Легенда
  • 9512
  • 1650 / 65
  • Севастополь == Россия
Re: Курсы валют с ЦБР
« Ответ #9 : 24.10.2012, 07:36:13 »
Прошу простить, вот функция
Код: php
function dailyxml_parser($url, $charcode)
{
    $file = simplexml_load_file($url);
    $valutes = array();
foreach ($file AS $el){
    $valutes[strval($el->CharCode)] = strval($el->Value);
}
return str_replace(',', '.', $valutes[$charcode]);
}
Все истины, которые я хочу вам изложить, — бесстыдная ложь. Записки нетрезвого кодера
Skype: beliyadm_pb
*

festLethal

  • Захожу иногда
  • 64
  • 1 / 0
Re: Курсы валют с ЦБР
« Ответ #10 : 24.10.2012, 07:48:54 »
Прошу простить, вот функция
Код: php
function dailyxml_parser($url, $charcode)
{
     $file = simplexml_load_file($url);
     $valutes = array();
foreach ($file AS $el){
   $valutes[strval($el->CharCode)] = strval($el->Value);
}
return str_replace(',', '.', $valutes[$charcode]);
}

Сейчас файл convertECB.php у меня выглядит так:
Код
<?php
        /*
        Сохранить http://www.cbr.ru/scripts/XML_daily.asp локально в modules\mod_course\cache
        С именем текущей даты. При загрузке модуля проверить совпадение даты, если нет - прочитать с ЦБ заново, удалить старый, сохранить новый
        Потом парсер
        */
function dailyxml_parser($url, $charcode)
{
     $file = simplexml_load_file($url);
     $valutes = array();
foreach ($file AS $el){
   $valutes[strval($el->CharCode)] = strval($el->Value);
}
return str_replace(',', '.', $valutes[$charcode]);
}
        $dailyxml = date('dmY');
        $dailyxml_url = JPATH_CACHE . DS . $dailyxml.'_daily.xml';
        if (JFile::exists($dailyxml_url)) {
         // файл уже есть, значит парсим, функция
         $usd = dailyxml_parser($dailyxml_url, 'USD');
         $eur = dailyxml_parser($dailyxml_url, 'EUR');
        } else {
         // файла нет, значит удалим файл за вчера, создадим и функция парсим
            $dailyxml_url_old = JPATH_CACHE . DS . date('dmY', time()-86400).'_daily.xml';
         JFile::delete($dailyxml_url_old);
         // новый файл
         $date = date('d/m/Y');
         $link = 'http://www.cbr.ru/scripts/XML_daily.asp?date_req='.$date;
         $fd = fopen($link, 'r');
   $dailyxml_text = '';
   if (!$fd) {
    echo 'error page www.cbr.ru/scripts/XML_daily.asp';
   } else {
       while (!feof ($fd)) $dailyxml_text .= fgets($fd, 4096);
   }
   fclose ($fd);
   // грабим текст в файл
   $dailyxml_url = JPATH_CACHE . DS . $dailyxml.'_daily.xml';
   JFile::write($dailyxml_url, $dailyxml_text);
   // получаем курс
   $usd = dailyxml_parser($dailyxml_url, 'USD');
            $eur = dailyxml_parser($dailyxml_url, 'EUR');
   }

?>
Но выдает ошибку 8/

Fatal error: Call to a member function convert() on a non-object in X:\home\localhost\www\Kond\administrator\components\com_virtuemart\helpers\currencydisplay.php on line 465

« Последнее редактирование: 24.10.2012, 07:59:59 от festLethal »
*

beliyadm

  • Легенда
  • 9512
  • 1650 / 65
  • Севастополь == Россия
Re: Курсы валют с ЦБР
« Ответ #11 : 24.10.2012, 07:52:28 »
в моем коде я ни слова не говорил про convertECB, это совершенно автономный код, не связанный ни с чем
Все истины, которые я хочу вам изложить, — бесстыдная ложь. Записки нетрезвого кодера
Skype: beliyadm_pb
*

festLethal

  • Захожу иногда
  • 64
  • 1 / 0
Re: Курсы валют с ЦБР
« Ответ #12 : 24.10.2012, 08:18:13 »
в моем коде я ни слова не говорил про convertECB, это совершенно автономный код, не связанный ни с чем

Сейчас я создал абсолютно новый файл под именем ConvertForum.php, вставил туда ваш код
Код
<?php
        /*
        Сохранить http://www.cbr.ru/scripts/XML_daily.asp локально в modules\mod_course\cache
        С именем текущей даты. При загрузке модуля проверить совпадение даты, если нет - прочитать с ЦБ заново, удалить старый, сохранить новый
        Потом парсер
        */
function dailyxml_parser($url, $charcode)
{
    $file = simplexml_load_file($url);
    $valutes = array();
foreach ($file AS $el){
    $valutes[strval($el->CharCode)] = strval($el->Value);
}
return str_replace(',', '.', $valutes[$charcode]);
}
        $dailyxml = date('dmY');
        $dailyxml_url = JPATH_CACHE . DS . $dailyxml.'_daily.xml';
        if (JFile::exists($dailyxml_url)) {
        // файл уже есть, значит парсим, функция
        $usd = dailyxml_parser($dailyxml_url, 'USD');
        $eur = dailyxml_parser($dailyxml_url, 'EUR');
        } else {
        // файла нет, значит удалим файл за вчера, создадим и функция парсим
            $dailyxml_url_old = JPATH_CACHE . DS . date('dmY', time()-86400).'_daily.xml';
        JFile::delete($dailyxml_url_old);
        // новый файл
        $date = date('d/m/Y');
        $link = 'http://www.cbr.ru/scripts/XML_daily.asp?date_req='.$date;
        $fd = fopen($link, 'r');
    $dailyxml_text = '';
    if (!$fd) {
    echo 'error page www.cbr.ru/scripts/XML_daily.asp';
    } else {
        while (!feof ($fd)) $dailyxml_text .= fgets($fd, 4096);
    }
    fclose ($fd);
    // грабим текст в файл
    $dailyxml_url = JPATH_CACHE . DS . $dailyxml.'_daily.xml';
    JFile::write($dailyxml_url, $dailyxml_text);
    // получаем курс
    $usd = dailyxml_parser($dailyxml_url, 'USD');
            $eur = dailyxml_parser($dailyxml_url, 'EUR');
    }

?>

Далее в настройках виртуамарта выбрал "Модуль валюты" , где выбрал файл convertForum.php
Теперь на вкладках сайта и вкладках админки, где цена товара указа не в рублях. а к примеру в евро вылазиет эта ошибка
Fatal error: Call to a member function convert() on a non-object in X:\home\localhost\www\Kond\administrator\components\com_virtuemart\helpers\currencydisplay.php on line 465
*

beliyadm

  • Легенда
  • 9512
  • 1650 / 65
  • Севастополь == Россия
Re: Курсы валют с ЦБР
« Ответ #13 : 24.10.2012, 08:32:13 »
ну и еще раз - не будет этот код работать в том месте, куда вы его вставляете
я дал просто пример, как брать данные с ХМЛ центробанка, сохранять раз в день и читать его, не более
Все истины, которые я хочу вам изложить, — бесстыдная ложь. Записки нетрезвого кодера
Skype: beliyadm_pb
*

festLethal

  • Захожу иногда
  • 64
  • 1 / 0
Re: Курсы валют с ЦБР
« Ответ #14 : 24.10.2012, 08:40:25 »
ну и еще раз - не будет этот код работать в том месте, куда вы его вставляете
я дал просто пример, как брать данные с ХМЛ центробанка, сохранять раз в день и читать его, не более

Ну и на этом спасибо, к сожалению я не смогу это применить к ВМ2, пока слишком слаб в PHP
*

festLethal

  • Захожу иногда
  • 64
  • 1 / 0
Re: Курсы валют с ЦБР
« Ответ #15 : 24.10.2012, 09:42:14 »
ну и еще раз - не будет этот код работать в том месте, куда вы его вставляете
я дал просто пример, как брать данные с ХМЛ центробанка, сохранять раз в день и читать его, не более
готов заплатить в пределах разумного за рабочий данный парсер, если вам это интересно, то напишите в ЛС. Очень нужно.
Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться
 

Конвертер валют и PayPal

Автор Sheff14

Ответов: 1
Просмотров: 685
Последний ответ 12.12.2015, 13:49:51
от Sheff14