msMultiCurrency

Компонент добавляет мультивалютность в miniShop2, а также позволяет привязывать цену отдельного товара к одной из
валют.
Видео-обзор
Купить
Prihod
10 мая 2018, 12:18
modx.pro
2
2 199
+13
Поблагодарить автора Отправить деньги

Комментарии: 51

Дмитрий
10 мая 2018, 16:04
+7
То, чего не хватало всем многие годы. Спасибо!
    Andrei Extra
    18 мая 2018, 02:19
    0
    Работает ли с mFilter2 когда фильтруешь по цене?
      Prihod
      18 мая 2018, 10:55
      0
      Фильтрация по цене будет работать но вот цена в фильтре всегда будет отображаться в базовой валюте. На следующей недели посмотрю как это можно исправить.
        Prihod
        19 июня 2018, 12:13
        0
        Инфа в доках, раздел mFilter2
      Андрей
      16 июля 2018, 11:53
      0
      Добрый день. Компонент позволяет задать привязку например к евро и выводить цену в рублях, на основе курса евро?
        Prihod
        16 июля 2018, 12:35
        0
        Да
        Евгений
        27 сентября 2018, 11:02
        0
        Возможно ли привязать цену не к каждому отдельному товару, а ко всем товарам отдельно взятой категории?
          Prihod
          27 сентября 2018, 11:11
          0
          нет
          Prihod
          02 ноября 2018, 17:59
          0
          UPD 1.0.3
          — Добавлено: Наборы значений валюты

          ВАЖНО! Перед обновлением не забывайте сделать бэкап базы данных. После обновления необходимо очистить кэш браузера
            Prihod
            17 февраля 2019, 14:22
            0
            UPD 1.0.4
            — Добавлено: Вывод полей: валюта, цена и старая цена в категории товара
            — Добавлено: Пересчет цены при импорте с помощью msImportExport

            Вывод цен и валюты в категории товаров
            Для того что бы поля “Валюта”, “Цена в выбранной валюте” или “Старая цена в выбранной валюте” вывести в категории товара, необходимо в системных настройках minishop2 для опцию “Поля таблицы товаров” (ключ ms2_category_grid_fields) добавить название нужных полей.

            currency_id — название валюты
            msmc_price — цена в выбранной валюте
            msmc_old_price — старая цена в выбранной валюте

            Пример
            id,menuindex,pagetitle,article,price,msmc_price,currency_id,thumb,new,favorite,popular
              Дмитрий
              18 марта 2019, 18:58
              0
              А как сделать что бы при изменении количества товара в корзине итоговая цена менялась в выбранной валюте?
                Prihod
                18 марта 2019, 19:03
                0
                ничего делать не нужно т/к она и так должна меняться если у тебя последняя версия minishop2 и msMultiCurrency ну и естественно если ты id у элементов формы не удалил
                  Дмитрий
                  18 марта 2019, 19:06
                  0
                  Не менял ничего, вот код корзины
                  <div class="cartPage" id="msCart">
                      <div class="cartPageTitle">
                      	<h2>
                      		Корзина
                      	</h2>
                      	<form class="clearCart" method="post">
                      	    <button class="clearCart" type="submit" name="ms2_action" value="cart/clean">
                      		    Очистить корзину
                      		</button>
                      	</form>
                      </div>
                      {if !count($products)}
                          {'ms2_cart_is_empty' | lexicon}
                      {else}
                      <div class="cartPageTable">
                          <div class="cartPageTableTitle">
                  			<p class="columnImage cartPageTableTitleEl">
                  				Товар
                  			</p>
                  			<p class="columnDescription cartPageTableTitleEl">
                  				Описание
                  			</p>
                  			<p class="columnPrice cartPageTableTitleEl">
                  				Цена
                  			</p>
                  			<p class="columnCount cartPageTableTitleEl">
                  				Количество
                  			</p>
                  			<p class="columnClose cartPageTableTitleEl"></p>
                      	</div>
                      	<div class="cartPageTableContent">
                      	    {foreach $products as $product}
                      	    <div class="cartPageTableContentEl" id="{$product.key}">
                      	        <div class="goodsImageColumnWrapper">
                  					<div class="goodsImageColumn">
                  						{if $product.thumb?}
                                                  <img src="{$product.thumb}" alt="{$product.pagetitle}" title="{$product.pagetitle}"/>
                                              {else}
                                                  <img src="{'assets_url' | option}components/minishop2/img/web/ms2_small.png"
                                                       srcset="{'assets_url' | option}components/minishop2/img/web/ms2_small@2x.png 2x"
                                                       alt="{$product.pagetitle}" title="{$product.pagetitle}"/>
                                              {/if}
                  					</div>
                  				</div>
                  				<div class="goodsDescriptionColumnWrapper">
                  					<div class="goodsDescriptionColumn">
                  						<p>
                  							<strong>Артикул:  </strong>
                  							{$product.article}
                  						</p>
                  						<p class="goodsDescriptionColumnBrief">
                  							{if $product.options?}
                                                  {foreach $product.options as $key => $option}
                                                      {if $key in ['modification','modifications','msal']}{continue}{/if}
                                              
                                                      {set $caption = $product[$key ~ '.caption']}
                                                      {set $caption = $caption ? $caption : ('ms2_product_' ~ $key) | lexicon}
                                                      
                                                      {if $option is array} 
                                                      {$caption} - {$option | join : '; '} 
                                                      {else}
                                                      {$caption} - {$option} 
                                                      {/if}
                                                      
                                                  {/foreach}
                                              {/if}
                  						</p>
                  					</div>
                  				</div>
                  				<div class="goodsPrice">
                  					<p>
                  					    [[!msMultiCurrencyPrice? &price=`{$product.price}`]][[!+msmc.symbol_right]]
                  					</p>
                  				</div>
                  				<div class="goodsAmount">
                      			<form method="post" class="ms2_form e quantity" role="form">
                      			  <input type="hidden" name="key" value="{$product.key}"/>
                      			  <a class="minus" href="#reduce">-</a>
                      			  <input type="number" name="count" class="counter" value="{$product.count}"/>
                      			  <a class="plus" href="#add">+</a>
                      			  <button class="btn btn-default" type="submit" name="ms2_action" value="cart/change">
                      				<i class="glyphicon glyphicon-refresh"></i>
                      			  </button>
                  			    </form>
                      			</div>
                      			<div class="goodsClose">
                  					<form method="post" class="ms2_form">
                  					    <input type="hidden" name="key" value="{$product.key}">
                  						<button type="submit" name="ms2_action" value="cart/remove">
                  							<img class="goodsCloseButton" src="img/cart/closeIcon.png" alt="">
                  							<img class="goodsCloseButtonHover" src="img/cart/closeHoverIcon.png" alt="">
                  						</button>
                  					</form>
                  				</div>
                      	    </div>
                      	    {/foreach}
                      	</div>
                      	<div class="cartPageResult">
                      	    <p>
                      			<strong>
                      				{'ms2_cart_total' | lexicon}:  
                      			</strong>
                      			<span class="ms2_total_cost">[[!msMultiCurrencyPrice? &price=`{$total.cost}`]]</span> 	[[!+msmc.symbol_right]]
                      		
                      		</p>
                      		<div class="cartPageResultButton">
                  				<a href="[[++site_url]]">
                  					Назад в магазин
                  				</a>
                  				<a href="[[~56]]">Оформить заказ</a>
                  			</div>
                      	</div>
                      </div>
                      {/if}
                  </div>
                    Prihod
                    18 марта 2019, 19:31
                    0
                    скинь мне через техподдержку доступ в админку сайта
                homka
                21 марта 2019, 12:20
                0
                установили модуль. пытаемся создать поставщика котировок валют и не ясно как это сделать. согласно инструкции должна быть папка providers и в ней класс пример. но такой нет папки или что-то не так поняла??
                Сергей
                03 мая 2019, 14:37
                +1
                Компонент работает с динамическим обновлением цен и товаров на компоненте msMCD, проверил на своем проекте
                Чанк вывода msMCDMiniCartRowTpl
                Вывод цены товара [[!msMultiCurrencyPrice? &price=`{$item.price}`]] [[!+msmc.symbol_right]]
                Вывод суммы [[!msMultiCurrencyPrice? &price=`{$total_cost}`]]
                  Сергей
                  03 мая 2019, 16:30
                  0
                  fenom
                  Вывод цены товара  {'!msMultiCurrencyPrice' | snippet : ['price' => $item.price,]} {$_modx->getPlaceholder('msmc.symbol_right')}
                  
                  Вывод суммы {'!msMultiCurrencyPrice' | snippet : ['price' => $total_cost,]} {$_modx->getPlaceholder('msmc.symbol_right')}
                  Владимир
                  27 мая 2019, 14:37
                  0
                  Ребята, добрый день! Нужна ваша помощь. В общем проблема с выводом конвертированной суммы на страницу оплаты через liqPay.
                  Коротко о поставленной мне задачи:
                  У товаров основной валютой должно быть Евро, но в корзине и на страницу оплаты через Liqpay должна быть цена пересчитанная в грн. В общем все настроил, только вот в LiqPay заходит сумма не 3000 грн, 100 грн, где 100 это цена товара в евро.
                    Prihod
                    27 мая 2019, 15:27
                    0
                    Ну так дополнение которое реализует оплату liqPay берет цену из поля price, а у тебя там цена в евро вот ты и получаешь 100 грн. Система оплаты ничего же не знает о msMultiCurrency. Поэтому тебе нужно, если конечно в этом модуле оплаты есть системное событие, прикрутить плагин в котором конвертировать сумму из евро в гривну. Вот код конвертации.

                    $convertCurrencyId = 2; // ID валюты в которую нужно конвертировать цену. У гривны это 2  
                    $msmc = $modx->getService('msmulticurrency', 'MsMC');
                    $convertPrice =  $msmc->getPrice($price, 0, $convertCurrencyId, 0, false);
                      Владимир
                      27 мая 2019, 15:44
                      0
                      Огромное спасибо! Буду пробовать
                        Владимир
                        27 мая 2019, 16:43
                        0
                        На сколько я понял скрипт находиться здесь core/components/minishop2/custom/payment/liqpay.class.php
                        <?php
                        
                        if (!class_exists('msPaymentInterface')) {
                        	require_once dirname(dirname(dirname(__FILE__))) . '/model/minishop2/mspaymenthandler.class.php';
                        }
                        
                        class LiqPay extends msPaymentHandler implements msPaymentInterface {
                        	public $config;
                        	public $modx;
                        
                        	function __construct(xPDOObject $object, $config = array()) {
                        		$this->modx = & $object->xpdo;
                        		$siteUrl = $this->modx->getOption('site_url');
                        		$assetsUrl = $this->modx->getOption('minishop2.assets_url', $config, $this->modx->getOption('assets_url').'components/minishop2/');
                        		$paymentUrl = $siteUrl . substr($assetsUrl, 1) . 'payment/liqpay.php';
                        		$this->config = array_merge(array(
                        			'paymentUrl' => $paymentUrl
                        			,'checkoutUrl' => $this->modx->getOption('ms2_payment_liqpay_url', null, 'https://www.liqpay.com/api/pay', true)
                        			,'public_key' => $this->modx->getOption('ms2_payment_liqpay_public_key')
                        			,'private_key' => $this->modx->getOption('ms2_payment_liqpay_private_key')
                        			,'currency' => $this->modx->getOption('ms2_payment_liqpay_currency', 'USD')
                        			,'culture' => $this->modx->getOption('ms2_payment_liqpay_culture', 'ru')
                        			,'sandbox' => $this->modx->getOption('ms2_payment_liqpay_sandbox')
                        			,'payway' => $this->modx->getOption('ms2_payment_liqpay_payway', 'card, liqpay, delayed, invoice, privat24', true)
                        		), $config);
                        	}
                        
                        	/* @inheritdoc} */
                        	public function send(msOrder $order) {
                        		$link = $this->getPaymentLink($order);
                        		return $this->success('', array('redirect' => $link));
                        	}
                        
                        	public function getPaymentLink(msOrder $order) {
                        		$id = $order->get('id');
                        		$successUrl = $this->config['paymentUrl']."?action=success&order_id=".$id;
                        		$sum = number_format($order->get('cost'), 2, '.', '');
                                $description='Payment #'.$id;
                                $signature = base64_encode(sha1($this->config['private_key'].$sum.$this->config['currency'].$this->config['public_key'].$id.'buy'.$description.$successUrl.$this->config['paymentUrl'],1));
                        		$request = array(
                        			'url' => $this->config['checkoutUrl']
                        			,'public_key' => $this->config['public_key']
                        			,'amount' => $sum
                        			,'order_id' => $id
                        			,'type' => 'buy'
                        			,'pay_way' => $this->config['payway']
                        			,'language' => $this->config['culture']
                        			,'sandbox' => $this->config['sandbox']
                        			,'signature' => $signature
                        			,'description' => $description
                        			,'result_url'=> $successUrl
                        			,'server_url' => $this->config['paymentUrl']
                        			,'currency' => $this->config['currency']
                        		);
                        		$link = $this->config['checkoutUrl'] .'?'. http_build_query($request);
                        		return $link;
                        	}
                        
                        	/* @inheritdoc} */
                        	public function receive(msOrder $order, $params = array()) {
                        		$id = $order->get('id');
                        		$success =
                                    isset($_POST['amount']) &&
                                    isset($_POST['currency']) &&
                                    isset($_POST['public_key']) &&
                                    isset($_POST['description']) &&
                                    isset($_POST['order_id']) &&
                                    isset($_POST['type']) &&
                                    isset($_POST['status']) &&
                                    isset($_POST['transaction_id']) &&
                                    isset($_POST['sender_phone']);
                                if (!$success) { die(); }
                                $amount = $_POST['amount'];
                                $currency = $_POST['currency'];
                                $public_key = $_POST['public_key'];
                                $description = $_POST['description'];
                                $order_id = $_POST['order_id'];
                                $type = $_POST['type'];
                                $status = $_POST['status'];
                                $transaction_id = $_POST['transaction_id'];
                                $sender_phone = $_POST['sender_phone'];
                                $insig = $_POST['signature'];
                                if ($order_id!=$id) { die(); }
                                $private_key = $this->config['private_key'];
                                $gensig = base64_encode(sha1(join('',compact(
                                    'private_key',
                                    'amount',
                                    'currency',
                                    'public_key',
                                    'order_id',
                                    'type',
                                    'description',
                                    'status',
                                    'transaction_id',
                                    'sender_phone'
                                )),1));
                                if ($insig != $gensig) { die(); }
                                if ($status == 'sandbox' || $status == 'success') {
                                	/* @var miniShop2 $miniShop2 */
                        			$miniShop2 = $this->modx->getService('miniShop2');
                        			@$this->modx->context->key = 'mgr';
                        			$miniShop2->changeOrderStatus($order->get('id'), 2);
                        			exit('OK');
                                } elseif ($status == 'failure') {
                                    $this->paymentError('Err: wrong signature.', $params);
                                }
                        	}
                        
                        	public function paymentError($text, $request = array()) {
                        		$this->modx->log(modX::LOG_LEVEL_ERROR,'[miniShop2:LiqPay] ' . $text . ', request: '.print_r($request,1));
                        		header("HTTP/1.0 400 Bad Request");
                        
                        		die('ERR: ' . $text);
                        	}
                        }
                        Вот только как прикрутить к нему выше указанный Вами код, реально не выкупаю. Буду весьма признателен за помощь
                          Prihod
                          27 мая 2019, 17:04
                          0
                          ну тебе нужно сделать свой класс который будет наследникам LiqPay в котором переопределить метод getPaymentLink т/к в этом методе происходит получение цены заказа. Нужно
                          $sum = number_format($order->get('cost'), 2, '.', '');
                          заменить на

                          $msmc = $modx->getService('msmulticurrency', 'MsMC');
                          $sum =  $msmc->getPrice($order->get('cost'), 0, 2, 0, false);
                          $sum = number_format($sum, 2, '.', '');


                          потом естественно свой класс нужно указать в настройках miniShop2 prntscr.com/ntykpc
                            Владимир
                            27 мая 2019, 18:04
                            0
                            На данный момент в minishope в выборе класса оплаты нельзя вбить свой, а в выпадающем меню только PayPal и LiqPay. Есть ли возможность откорректировать родительский класс?
                              Prihod
                              27 мая 2019, 20:03
                              0
                              ну по моему если ты этот свой класс добавишь в core/components/minishop2/custom/payment то он появиться в списке
                                Владимир
                                27 мая 2019, 21:34
                                0
                                В общем через создание нового класса так и не получилось (виснет корзина, а при обновлении страницы пишет корзина пуста), но засветилась ошибка в логах, о конфликте с компонентом msExtraFields, снес компонент и выбранная валюта стала передаваться в LiqPay, в общем огромное спасибо! Напишу скрипт на выбор гривны при загрузке страницы и удаления выпадающего списка и будет все ок). Еще раз спасибо!
                      Evgeny Tarasov
                      11 февраля 2020, 12:21
                      0
                      Планирую приобрести данное дополнение.
                      Подскажите, может кто сталкивался, дополнение msMultiCurrency работает с msOptionsPrice2?
                      Володя (автор msOptionsPrice2) сказал, что нужно уточнять у разработчика msMultiCurrency.
                        Prihod
                        11 февраля 2020, 18:14
                        0
                        Частично, не работает привязка товара к валюте т.к для этого нужно делать правки компонента msOptionsPrice2
                          Александр
                          24 апреля 2020, 22:51
                          0
                          Не подскажите, в каком направлении должны быть правки?
                            Prihod
                            24 апреля 2020, 22:57
                            0
                            когда привязывается цена к валюте то цена в выбранной валюте указывается в отдельном поле которое добавлено к товару, у модификаций msOptionsPrice2 такого поля нет и добавить его через плагин как это сделано для товара нельзя
                        Николай
                        11 февраля 2020, 17:19
                        0
                        Планирую купить ваш компонент, однако задача стоит нетривиальная. Может ли ваш компонент по клику менять цену в [[+price]]. Допустим менеджер внес цену в евро (т.к. именно в евро ему дает цену поставщик), потом он нажимает где то в админке кнопку и цена меняется именно в поле [[+price]] на рубли. В общем клиент хочет менять валюту в бекенде точнее в своей админке причем именно нажатием на кнопку, он не планирует импортировать товары.
                          Prihod
                          11 февраля 2020, 18:11
                          0
                          Привязка товара к валюте так и происходит, ты вводишь цену в выбранной валюте, а она автоматом пересчитывается по курсу в базовую при сохранении товара
                          Prihod
                          13 февраля 2020, 22:39
                          0
                          UPD 1.1.0
                          — Добавлено: Параметр «ID валюты по умолчанию на сайте» (для разных контекстов можно указать свою валюту)
                          — Изменено: При включенной опции «Цена в корзине в валюте пользователя» заказ создается в валюте выбранной пользователем. ВАЖНО! Если используется какой то платежный сервис то значение цены для него будет в валюте выбранной пользователем.
                          — Изменено: Cниппет «msMultiCurrencyCart» (в чанках больше не нужно использовать сниппет msMultiCurrencyPrice)
                          — Улучшено: Работа с контекстами
                            Владимир Ребров
                            25 февраля 2020, 19:23
                            0
                            При создании нового товара устанавливается код валюты = 0. Без названия валюты, которого естественно и быть не может, так как валюты с таким кодом в базе нет.


                            После сохранения нового товара, даже, если принудительно выбираю базовую (основную) валюту, код валюты опять сбрасывается в ноль и наблюдается картина со скрина выше.

                            Если выбрать для нового товара небазовую неосновную валюту, то в этом случае основная цена пересчитывается и после сохранения товара выбранная валюта сохраняется, но в поле валюты отображается её ID, а не название.
                              Владимир Ребров
                              25 февраля 2020, 22:59
                              +1
                              Вопрос закрыт в рамках техподдержки. Спасибо автору дополнения за помощь и исчерпывающую консультацию.
                              Arahort
                              10 апреля 2020, 11:29
                              0
                              Здравствуйте, стоит задача дать возможность вносить в админке цены в рубля\долларах\евро и на сайте везде выводить в рублях, установил на modhost тестовую версию, не с первого раза но всё таки обновились курсы валют, ввожу цену в долларах, в поле price как и должно быть появляется цена в рублях по курсу. Но я так понял при смене курса цены не меняются? Вручную изменил курс — цены остались те же?
                                local
                                10 апреля 2020, 11:50
                                0
                                в настройках модуля указано, что нужно его автоматически обновлять?
                                https://prnt.sc/rm1onf
                                  Arahort
                                  10 апреля 2020, 14:32
                                  0
                                  Да joxi.ru/ZrJ9e5LcM74vxA
                                  P.S Я имею ввиду изменение не курса, а цены товара при смене курса
                                    local
                                    10 апреля 2020, 14:41
                                    0
                                    при изменение курса, цена меняется, когда включена эта опция
                                      Arahort
                                      10 апреля 2020, 14:45
                                      0
                                      Цена уже созданных товаров? Я вручную меняю курс доллара например на 80 — цена товаров остаётся прежней
                                        Prihod
                                        10 апреля 2020, 19:03
                                        0
                                        все должно пересчитываться даже если ты вручную меняешь курс валюты так что смотри лог modx и лог ошибок сервера. Ну и проверь что у тебя не закешировались данные товара
                                Andrey
                                10 апреля 2020, 19:47
                                0
                                добрый день.
                                планируем использовать дополнение, чтобы в контексте с англ. версией сайта выводить цену в USD.
                                Используем msOptionPrice (для опций цвета, не для цен)
                                Есть вопросы:
                                1. Можем ли заводить вручную цены в USD и в рублях по-отдельности? я так понял, они будут связаны курсом?
                                Мы не хотим привязываться к курсу, сами все цены круглые проставим.
                                2. возможно, был опыт — через какую платежную систему можем брать оплату с карт в долларах?
                                и в них же получать потом на расчётный счет.
                                сейчас используется яндекс.касса, но они все равно транзакции только в рублях могут производить.
                                  Prihod
                                  10 апреля 2020, 20:17
                                  0
                                  Можем ли заводить вручную цены в USD и в рублях по-отдельности? я так понял, они будут связаны курсом?
                                  Нет, но в новой версии возможно эта возможность будет
                                    Andrey
                                    10 апреля 2020, 20:26
                                    0
                                    как скоро можно ожидать?
                                      Prihod
                                      10 апреля 2020, 20:28
                                      0
                                      не раньше июня
                                        Andrey
                                        28 мая 2020, 11:12
                                        0
                                        добрый день!
                                        очень ждем, готовы проспонсировать функцию
                                  Виктор
                                  07 июля 2020, 18:53
                                  0
                                  Сергей, приветствую! Что-то у меня техподдержка на день раньше отключилась. Спасибо тебе огромное за помощь. По последнему вопросу с НП — да, совсем мимо задал… Но всё получилось!)

                                  Возник еще момент странный. Пока доработка liqpay в процессе, снял в настройках «отображение корзины в валюте пользователя». Но вот что вышло — итоговая сумма, сумма за каждый товар показывается как надо — не переключаются, а «итого с доставкой» всё равно переключается вместе со сменой валюты.

                                  Сайт — lovebythemoon.store
                                    Prihod
                                    09 июля 2020, 15:12
                                    0
                                    Hi, доступы к сайту актуальные? Если нет то сделай такие как были раньше я сегодня постараюсь посмотреть
                                      Виктор
                                      10 июля 2020, 18:18
                                      0
                                      Да, те же. Сумму вызывал как положено — без сниппета
                                        Prihod
                                        12 июля 2020, 21:43
                                        0
                                        в общим там в js файле msMultiCurrency остался код от старой версии я у тебя ее поправил
                                    Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
                                    51