Shopkeeper3 проблема с мультивалютностю



  • MODX Revolution 2.3.6-pl
    shopkeeper3 3.2.4-pl

    Изминяю курс валют на странице настроек, но на сайте выводтся старое значение товара, для старого курса.

    В шаблоне товара:

    [[!*price:shk_curr_rate:num_format]]
    

    Кеш удалял.



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

    PS: рецепт не 100%, тк именно Ваш случай не тестил. Если не получится, то вариант вычеркнут будет )



  • Спасибо за ответ, но этот вариант не может помочь(
    В снипет shk_curr_rate приходит старое занчения курса.


  • Администраторы

    Мало информации.



  • @sashklym если не в этом дело, то информации и правда недостаточно.

    следующее по цепочке рассуждение - приходит старое значение откуда? и почему должно приходить новое (что именно где изменилось)? проследить всю цепочку передачи значений - где-то что-то не так) менее абстрактно ответить, не видя всех данных, не могу.
    ps: если php 705 и modx 25 - экстры некоторые, случается, не совсем ожидаемо себя ведут.

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



  • @Andchir

    'Если на сайте только одна валюта, но цены товаров указаны в другой валюте':
    Параметр «shk3.currency_selected» добавлен.
    http://joxi.ru/1A5bRdquKPOROr

    Курс 25:
    Скрин настроек:
    http://joxi.ru/1A5bRdquKPObKr
    Цена на сайте:
    http://joxi.ru/L21L3Q7F6oZxym

    Курс 20:
    Скрин настроек:
    http://joxi.ru/gmvRjnLFxgJRYm
    Цена на сайте (не меняется):
    http://joxi.ru/EA4NaWJsDRGyLm

    В шаблоне товара:
    [[!*price:shk_curr_rate:num_format]]

    Какую еще информацию нужно написать?



  • @sashklym Проблема аналогичная, удалось решить?



  • @Andchir Проблема абсолютно такая же, при смене цены, пересчитывает все по курсу, но при смене самого курса, все пересчитывается по старому курсу, как решить?



  • @andry-93

    Код Сниппета 'shk_curr_rate':

    <?php
    /*
     * shk_curr_rate snippet
     * example: [[!*price:shk_curr_rate]] [[!+shk_currency]]
     */
    
    if(!function_exists('shk_currency_calc')){
        function shk_currency_calc($properties, $base_price, $currency_id, $rate_ratio = 0){
            
            $inverse = isset($properties['inverse']) ? $properties['inverse'] : false;//обратный перевод цены
            
            if( !$rate_ratio ){
                
                if( false && isset( $_SESSION['shk_curr_rate'] ) && is_numeric( $_SESSION['shk_curr_rate'] ) && !$inverse ){
                    
                    $rate_ratio = $_SESSION['shk_curr_rate'];
                    
                }else{
                    
                    if( !isset( $properties['currency_rate'] ) ){
                        require_once MODX_CORE_PATH . "components/shopkeeper3/model/shopkeeper.class.php";
                        $config = Shopkeeper::getConfig( array('currency_rate') );
                        $properties['currency_rate'] = $config['currency_rate'];
                    }
                    
                    $rate_ratio = 1;
                    
                    if( $properties['currency_default'] != $currency_id ){
                        
                        $rate_default = 1;
                        $rate = 1;
                        //Определяем курс по умолчанию и новый курс
                        foreach( $properties['currency_rate'] as $rt ){
                            if( $rt['id'] == $properties['currency_default'] ){
                                $rate_default = Shopkeeper::cleanNumber( $rt['value'], 'float' );
                            }
                            else if( $rt['id'] == $currency_id ){
                                $rate = Shopkeeper::cleanNumber( $rt['value'], 'float' );
                            }
                        }
                        
                        if( !$inverse ){
                            $rate_ratio = $rate_default / $rate;
                            $_SESSION['shk_curr_rate'] = $rate_ratio;
                        }else{
                            $rate_ratio = $rate / $rate_default;
                        }
                        
                    }
                    
                }
                
            }
            
            //Считаем цену по курсу
            if( $rate_ratio ){
                
                $price = $base_price * $rate_ratio;
                $price = round( $price, ( ceil( $price ) == $price ? 0 : 2 ) );
                return $price;
            
            }else{
                return $base_price;
            }
            
        }
    }
    
    $scriptProperties = array_merge(
        array(
            'currency_default' => $modx->getOption( 'shk3.currency_default', null, 1 ),
            'currency_selected' => $modx->getOption( 'shk3.currency_selected', null, 0 )
        ),
        $scriptProperties
    );
    
    $output = floatval(str_replace(array(' ',','), array('','.'), $scriptProperties['input']));
    $shk_currency = !empty($_COOKIE['shk_currency']) && is_numeric($_COOKIE['shk_currency']) ? abs(intval($_COOKIE['shk_currency'])) : $scriptProperties['currency_default'];
    //Если нужен всегда преевод в одну валюту
    if( !empty( $scriptProperties['currency_selected'] ) && $shk_currency != $scriptProperties['currency_selected'] ){
        setcookie( 'shk_currency', intval($scriptProperties['currency_selected']), time()+3600*24, "/" );
        $shk_currency = intval($scriptProperties['currency_selected']);
    }
    
    //Считаем цену по курсу
    $output = shk_currency_calc( $scriptProperties, $output, $shk_currency );
    
    return $output;
    


  • @sashklym не помогло



  • @sashklym вывожу так:

    <table>
    	<tr>
    		<th>Цена:</th>
    		<td>[[!*price:shk_curr_rate:num_format]] [[!+shk_currency]]</td>
    	</tr>
    	<tr>
    		<th>Цена в долларах:</th>
    		<td>[[!*price:num_format]] $</td>
    	</tr>
    </table>
    

    Настройки Shopkeeper 3:
    0_1470828460156_Снимок.PNG
    Список валют:
    0_1470828492544_Снимок1.PNG



  • @Andchir проблема оказалась вот в чем, все решается при очистке cookies, как отключить cookies для этого параметра, так как каждый раз очищать cookies при смене валюты, это не удобно


  • Администраторы

    @andry-93

    но при смене самого курса, все пересчитывается по старому курсу, как решить?

    Кэш сайта чистили?



  • @Andchir да, и на сайте, и в браузере, помогла только чистка куков в самом браузере



  • @Andchir Есть ли возможность обновлять куки, при смене курса? Если конечно проблема в этом


  • Администраторы

    Курс валют хранится не в куках, а в сессии. Т.е. если человек зашел на сайт, для него курс уже не изменен на одну сессию. Если курс обновился, то в следующий раз когда посетитель снова откроет браузер и зайдет на сайт, у него курс тоже обновится. У вас же не меняется курс каждые пять минут.



  • @Andchir тогда такой вопрос, я открыл браузер, поменял курс, закрыл браузер, подождал 20 минут, открыл сново браузер, цена не пересчиталась.
    Или между сессиями после закрытия браузера есть некий интервал времени, когда сессия закроется?


  • Администраторы

    когда сессия закроется?

    Попробуйте перезагрузить компьютер. Браузеры часто хитрят и висят в фоновом режиме после закрытия чтобы быстро открыться в следующий раз. Плюс ещё они умеют восстанавливать сессию, если вы закрыли браузер, но не закрыли вкладку.


  • Администраторы

    Хотя тут скорее всего дело не в браузере, а настройках MODX.
    Там есть такой параметр: session_cookie_lifetime. По умолчанию там неделя стоит.



  • Да уж. Старая цена в браузере висит до победного при смене курса валюты, пока не почистишь куки браузера. Причем и в оформление заказа в корзине уходит товар тоже по старой цене. Весь день просидел, так ничего и не придумал. Подскажет кто вариант как можно решить, кроме session_cookie_lifetime?



Похоже, подключение к Форум | MODX Shopkeeper было разорвано, подождите, пока мы пытаемся восстановить соединение.