1. Уважаемые пользователи, прежде чем ответить в теме или создать новую,
    внимательно ознакомьтесь с правилами раздела

    Кому лень работать или руки не оттуда - пользуйтесь услугами специалистов
  2. Не задавайте глупых вопросов "Посоветуйте какой-нибудь компонент.."

    Есть JED!!! Ищите там!!!

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

Тема в разделе "Virtuemart", создана пользователем erik87, 15 авг 2011.

Информация :
  • Уважаемые пользователи, прежде чем ответить в теме или создать новую, внимательно ознакомьтесь с правилами раздела
  • Не задавайте глупых вопросов "Посоветуйте какой-нибудь компонент.." Есть JED!!! Ищите там!!!
  • Аналоги ищите там же - на JED!!!
  • Новая версия? - У кого будет - тот выложит!
Статус темы:
Закрыта.
  1. erik87

    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. Очень надо.

    Спасибо
     
  2. Genk0

    Genk0

    Регистр.:
    2 июн 2010
    Сообщения:
    10
    Симпатии:
    10
    Ставь основной валютой магазина (и отображения валют) - MDL
    На flypage выводи стоимость как есть.
    На browse выводи стоимость, обрезай лишние знаки с php функцией (это символы MDL) и умножай/дели на курс.
    Получится что в browse - доллары
    во fly, в заказах и корзине будут MDL
    Если не получитя - стучи в аську помогу.
     
  3. elnine

    elnine Создатель

    Регистр.:
    22 авг 2011
    Сообщения:
    37
    Симпатии:
    3
    С форума 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, что бы он брал курс из другого банка. Примеры такого есть, когда курс берётся с ЦБ РФ.
     
    erik87 нравится это.
  4. erik87

    erik87

    Регистр.:
    30 сен 2008
    Сообщения:
    206
    Симпатии:
    10
    hipachka нравится это.
  5. hipachka

    hipachka

    Регистр.:
    16 мар 2009
    Сообщения:
    391
    Симпатии:
    78
    Мне подошло вот такое решение. Парсит ЦБРФ. Версия Joomla 1.5.23 версия Virtuemart 1.1.9
    http://www.liveinternet.ru/users/csh/post197903834/

    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'] !== -) {
         
     
                
    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 ) > ) {
                    
    // штамп времени файла
                      
    $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
    }
    ?>
     
Статус темы:
Закрыта.