Ищу Конвертор валют для Virtuemart

Статус
В этой теме нельзя размещать новые ответы.

erik87

Старатель
Регистрация
30 Сен 2008
Сообщения
206
Реакции
10
Такая проблема.

VM: 1.5. Основная валюта: молдавский лей. В настройках указан модуль конвертора валют: convertECB.php. Мне надо, что бы на товаре можно было бы указать цену в USD(валюта установлена) и на flypage показывалась цена по курсу в леях и по такой же цене товар добавлялся в корзину. Сейчас если, например, указываю цену товара (с налогами:( $113, flypage выдает - MDL 79.30, когда должно быть примерно MDL 1 265,93.

Пробовал ставить Oanda currency converter, XE, но у них нет никаких настроек. Подскажите, в чем может быть проблема или может я что-то не то делаю, либо не правильно пользуюсь Oanda и XE. Очень надо.

Спасибо
 
Ставь основной валютой магазина (и отображения валют) - MDL
На flypage выводи стоимость как есть.
На browse выводи стоимость, обрезай лишние знаки с php функцией (это символы MDL) и умножай/дели на курс.
Получится что в browse - доллары
во fly, в заказах и корзине будут MDL
Если не получитя - стучи в аську помогу.
 
Такая проблема.
VM: 1.5. Основная валюта: молдавский лей. В настройках указан модуль конвертора валют: convertECB.php. Мне надо, что бы на товаре можно было бы указать цену в USD(валюта установлена) и на flypage показывалась цена по курсу в леях и по такой же цене товар добавлялся в корзину. Сейчас если, например, указываю цену товара (с налогами:( $113, flypage выдает - MDL 79.30, когда должно быть примерно MDL 1 265,93.
Пробовал ставить Oanda currency converter, XE, но у них нет никаких настроек. Подскажите, в чем может быть проблема или может я что-то не то делаю, либо не правильно пользуюсь Oanda и XE. Очень надо.
Спасибо

С форума virtuemart.ru

Проблема 4:
Стоимость товара не соответствует задаваемой мной, она намного больше
Решение:
Virtuemart воспринимает задаваемую в карточке товара цену в евро и автоматически конвертирует по курсу, взятому из интернета. Хотя везде вроде проставлено, что цены в рублях.
Открываем файл cache\daily.xml и изменяем в нём множитель для рублей:
<Cube currency='RUB' rate='1'/>
Потом отключаем автообновление курсов валют, для чего комментируем строку в файле \administrator\components\com_virtuemart\classes\currency\convertECB.php
// var $document_address = 'http://www.ecb.int/stats/eurofxref/eurofxref-daily.xml';

Переписать по аналогии.

Ну, или можно переписать convertECB.php, что бы он брал курс из другого банка. Примеры такого есть, когда курс берётся с ЦБ РФ.
 
Мне подошло вот такое решение. Парсит ЦБРФ. Версия Joomla 1.5.23 версия Virtuemart 1.1.9


PHP:
<?php
if( !defined( '_VALID_MOS' ) && !defined( '_JEXEC' ) ) die( 'Direct Access to '.basename(__FILE__).' is not allowed.' );
/**
* Модуль конвертера валют ЦБРФ для Virtuemart,
* основан на оригинальном convertECB.php
* Курс = курсу ЦБРФ на ТЕКУЩИЙ! день
* Модуль является полностью бесплатным, в случае его модификации
* не допускается его коммерческое использование.
* Последнюю версию можно найти по адресу:
* http://www.liveinternet.ru/users/csh/post197903834/
*
* Поблагодарить за труды Яндекс.Деньги: 41001164449086
*
* @version $Id: convertCBRF.php  2012-01-22  csh
* @package VirtueMart
* @subpackage classes
* @copyright Copyright (C) 2011 soeren - All rights reserved.
* @license http://www.gnu.org/copyleft/gpl.html GNU/GPL, see LICENSE.php
* VirtueMart is free software. This version may have been modified pursuant
* to the GNU General Public License, and as distributed it includes or
* is derivative of works licensed under the GNU General Public License or
* other free or open source software licenses.
* See /administrator/components/com_virtuemart/COPYRIGHT.php for copyright notices and details.
*
*
*/
 
class convertCBRF
{
    var $archive = true;
    var $last_updated = '';
 
    var $document_address = 'http://www.cbr.ru/scripts/XML_daily.asp'; 
    var $info_address = 'http://www.cbr.ru';
    var $supplier = 'Центральный банк Российской Федерации';
 
    /**
    * Initializes the global currency converter array
    *
    * @return mixed
    */
    function init() {
        global $mosConfig_cachepath, $mosConfig_absolute_path,
                $vendor_currency, $vmLogger;
             
        if( !is_array($GLOBALS['converter_array']) && $GLOBALS['converter_array'] !== -1 ) {
     
 
            setlocale(LC_TIME, "en-GB");
            $chas_p = 4;            // Время MSK: +4GMT
            $now = time() + $chas_p*3600;
         
            $weekday_now_local = date('w', $now); // день недели, неделя начинается с воскресенья (= 0) !!
            $date_now_local = date('Ymd', $now);
            $time_now_local = date('Hi', $now);
         
            if( is_writable($mosConfig_cachepath) ) {
                $store_path = $mosConfig_cachepath;
            }
            else {
                $store_path = $mosConfig_absolute_path."/media";
            }
           
            $archivefile_name = $store_path.'/daily_CBRF.xml';
            $cbrf_filename = $this->document_address;
            $val = '';
 
            //если файл существует и размер больше нуля
            if(file_exists($archivefile_name) && filesize( $archivefile_name ) > 0 ) {
                // штамп времени файла
                  $file_datestamp = date('Ymd', filemtime($archivefile_name) + $chas_p*3600);
                // штамп времени файла не равен текущему (год-месяц-день), т.е. другой день
                if( $file_datestamp != $date_now_local)
                    {
                    // тогда текущий файл равен файлу из интернета за текущий день
                    $curr_filename = $cbrf_filename.'?date_req='.date( 'd/m/Y', $now ); 
                    }
                // если день НЕ рабочий, или текущая дата равна дате архивного файла
                else
                    {
                    $curr_filename = $archivefile_name;        // тогда текущий файл равен архивному
                    $this->last_updated = $file_datestamp;    // последнее обновление равно времени архивного файла
                      $this->archive = false;                    // обновлять архивный файл? - нет
                    }
            }
            //если файл не существует
            else {
                // тогда текущий файл равен файлу из интернета за текущий день
                $curr_filename = $cbrf_filename.'?date_req='.date( 'd/m/Y', $now );
            }
           
            // если нет разрешения на запись
            if( !is_writable( $store_path )) {
              $this->archive = false;
              $vmLogger->debug( "The file $archivefile_name can't be created. The directory $store_path is not writable" );
            }
            // если текущий файл равен файлу из интернета
            if( $curr_filename == $cbrf_filename )
                {
                // запрашиваем файл из интернета
                require_once( CLASSPATH.'connectionTools.class.php');
                // содержимое равно файлу из интернета
                $contents = vmConnector::handleCommunication( $curr_filename );
                $this->last_updated = date('Ymd', $now);
                }
            // в противном случае, содержимое равно архивному файлу
            else 
                {
                $contents = @file_get_contents( $curr_filename );
                }
         
            //    если есть хоть какое-то содержимое, т.е. либо архивные либо из Интернет
            if( $contents )
                {
                // если требуется обновление (по рабочим дням и есть разрешение на запись)
                if( $this->archive ) {
                    // пишем новый файл
                    file_put_contents( $archivefile_name, $contents );
                }
             
                //добавочная строка о рубле, т.е. номинал одного рубля - 1 рубль
                $add_str = '<Valute ID="xxx"><NumCode>yyy</NumCode><CharCode>RUB</CharCode><Nominal>1</Nominal><Name>Российский рубль</Name><Value>1</Value></Valute>';
                $contents = str_replace ("</ValCurs>", "$add_str </ValCurs>", $contents); //дополняем базу информацией о рубле
             
                // по регулярному выражению ищем 3 заглавных буквы валюты (напр/ USD)
                preg_match_all ("/<CharCode>([A-Z]{3})<\/CharCode>/", $contents, $char_arr);
             
                // по регулярному выражению ищем число возможно  с запятой, номинал валюты
                preg_match_all ("/<Nominal>(\d+\,?\d*)<\/Nominal>/", $contents, $nom_arr);
 
                // по регулярному выражению ищем число возможно с запятой, курс валюты
                // (т.е. за номинал тугриков можно купить столькото рублей)
                preg_match_all ("/<Value>(\d+\,?\d*)<\/Value>/", $contents, $val_arr); 
 
                //формируем массив валют
                for ($i = 0; $i < count($char_arr[1]); $i++)
                {
                //т.е. на 1 рубль можно купить = номинал валюты / курс валюты
                $currency [$char_arr[1][$i]] = $nom_arr[1][$i]/(str_replace (',', '.', $val_arr[1][$i])); // преобразуем в числе запятую "," в точку "."
                }
 
                $GLOBALS['converter_array'] = $currency;
                }
             
            else
                {
                $GLOBALS['converter_array'] = -1;
                $vmLogger->err( 'Failed to retrieve the Currency.');
                $_SESSION['product_currency'] = $GLOBALS['product_currency'] = $vendor_currency;
                return false;
                }
        }
        return true;
    }
    /**
    * 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 $GLOBALS['product_currency'] (and that defaults to $vendor_currency)
    * @return mixed The converted amount when successful, false on failure
    */
    function convert( $amountA, $currA='', $currB='' )
    {
        global $vendor_currency;
 
        // global $vendor_currency is DEFAULT!
        if( !$currA ) {
            $currA = $vendor_currency;
        }
        if( !$currB ) {
            $currB = $GLOBALS['product_currency'];
        }
        // Если исходная валюта = выходной валюте, то ничего не делаем и возвращаем исходное значение
        if( $currA == $currB ) {     
            return $amountA;
        }
        // Если курс валюты не найден
        if( !$this->init()) {
            $GLOBALS['product_currency'] = $vendor_currency;
            return $amountA;
        }
        $valA = isset( $GLOBALS['converter_array'][$currA] ) ? $GLOBALS['converter_array'][$currA] : 1;
        $valB = isset( $GLOBALS['converter_array'][$currB] ) ? $GLOBALS['converter_array'][$currB] : 1;
     
        $val = $amountA * $valB / $valA;
        // $amountA    - Цена товара в родной валюте
        // $valA    - Курс для родной валюты тавара
        // $valB    - Курс валюты в какой хотим преобразовать
     
        //$vmLogger->debug('Converted '.$amountA.' '.$currA.' to '.$val.' '.$currB);
     
        return $val;
    } // end function convertecb
}
?>
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху