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 было разорвано, подождите, пока мы пытаемся восстановить соединение.