Отображение цены товара на сайте в другой валюте — различия между версиями

Материал из Umicms
Перейти к:навигация, поиск
Строка 1: Строка 1:
'''Стоит задача:''' в административной части сайта добавлять товары с ценой в долларах (USD) или евро (EUR), а на сайте отображать цены в рублях.
+
 
 +
'''Актуально для версии 20.'''
 +
 
 +
==Задача==
 +
Изменение валюты в которой отображаются цены на сайте на доллары (USD), евро (EUR) или любую другую.
 +
 
 +
==Решение==
  
 
Для реализации данной задачи, версия системы должна быть не ниже 2.8.4.
 
Для реализации данной задачи, версия системы должна быть не ниже 2.8.4.
В конфигурационном файле (config.ini) установим валюту по умолчанию, допустим: default-currency = "",
+
 
а для автоматического переключения валюты на сайте, воспользуемся кастомным макросом, который пропишем в файле ~classes/modules/custom.php, после слов: //TODO: Write your own macroses here
+
В конфигурационном файле (config.ini) установим валюту по умолчанию, допустим: default-currency = "RUR",
 +
а для автоматического переключения валюты на сайте, воспользуемся кастомным макросом, который пропишем в файле  
 +
/classes/modules/custom.php для старой реализации модулей
 +
или
 +
/classes/components/custom.php для новой реализации модулей
 +
, после слов: //TODO: Write your own macroses here
  
 
<source lang="php">
 
<source lang="php">
public function setcurrency(){
+
public function setcurrency($currencyCode = 'RUR'){
    $inst = cmsController::getInstance()->getModule("emarket");
+
$inst = cmsController::getInstance()->getModule("emarket");
    // Валюта в которой необходимо отображать цены на сайте.
 
    $currencyCode = "RUR";
 
 
    
 
    
    $selectedCurrency = $inst->getCurrency($currencyCode);
+
$selectedCurrency = $inst->getCurrency($currencyCode);
 
    
 
    
if($currencyCode && $selectedCurrency) {
+
if($currencyCode && $selectedCurrency) {
$defaultCurrency = $inst->getDefaultCurrency();
+
$defaultCurrency = $inst->getDefaultCurrency();
  
if(permissionsCollection::getInstance()->isAuth()){
+
if(permissionsCollection::getInstance()->isAuth()){
$customer = customer::get();
+
$customer = customer::get();
if($customer->preffered_currency != $selectedCurrency->id) {
+
if($customer->preffered_currency != $selectedCurrency->id) {
if($selectedCurrency->id == $defaultCurrency->id) {
+
if($selectedCurrency->id == $defaultCurrency->id) {
$customer->preffered_currency = null;
+
$customer->preffered_currency = null;
} else {
 
$customer->preffered_currency = $selectedCurrency->id;
 
}
 
$customer->commit();
 
}
 
 
} else {
 
} else {
setcookie('customer_currency', $selectedCurrency->id, (time() + 2678400), '/');
+
$customer->preffered_currency = $selectedCurrency->id;
 
}
 
}
 +
$customer->commit();
 
}
 
}
 +
} else {
 +
setcookie('customer_currency', $selectedCurrency->id, (time() + 2678400), '/');
 +
}
 +
}
 
}
 
}
 
</source>
 
</source>
 +
 +
===TPL шаблонизатор===
 +
 
Вызов макроса необходимо прописать в шаблонах страниц, допустим в любом месте тэга <body>.  
 
Вызов макроса необходимо прописать в шаблонах страниц, допустим в любом месте тэга <body>.  
 
Для tpl шаблонов вызов следующий:
 
Для tpl шаблонов вызов следующий:
<pre>
+
<source lang="php">
 +
%custom setcurrency('USD')%
 +
</source>
 +
или
 +
<source lang="php">
 
%custom setcurrency()%
 
%custom setcurrency()%
</pre>
+
</source>
 +
для смены валюты отображения цен на валюту по умолчанию.
  
 
В результате, при использовании макроса:
 
В результате, при использовании макроса:
<pre>
+
<source lang="php">
 
%emarket price(%id%, 'short')%
 
%emarket price(%id%, 'short')%
</pre>
+
</source>
  
 
цена будет указана в валюте, выбор которой был сделан в кастомном методе setcurrency(), 'short' - два шаблона, в папках:
 
цена будет указана в валюте, выбор которой был сделан в кастомном методе setcurrency(), 'short' - два шаблона, в папках:
Строка 47: Строка 64:
 
* \tpls\emarket\currency\
 
* \tpls\emarket\currency\
  
 +
===XSLT шаблонизатор===
  
 
Для XSLT-Шаблонизатора, необходимо в основном xsl-шаблоне сайта, в котором прописан тег '''head''' и '''body''',  
 
Для XSLT-Шаблонизатора, необходимо в основном xsl-шаблоне сайта, в котором прописан тег '''head''' и '''body''',  
 
необходимо прописать вызов:
 
необходимо прописать вызов:
 
<source lang="xml">
 
<source lang="xml">
<xsl:value-of select="document('udata://custom/setcurrency')" />
+
<xsl:value-of select="document('udata://custom/setcurrency/USD/')" />
 +
</source>
 +
или
 +
<source lang="xml">
 +
<xsl:value-of select="document('udata://custom/setcurrency/')" />
 
</source>
 
</source>
 +
для смены валюты отображения цен на валюту по умолчанию.
  
 
в теге head.
 
в теге head.
 +
 +
===PHP шаблонизатор===
 +
 +
В PHP шаблонизаторе нужно вызвать этот макрос перед тем как отображать цены товаров.
 +
 +
Оптимальным вариантом будет вызвать его в точке входа в шаблон, например для шаблона demomarket это будет файл
 +
 +
/templates/demomarket/php/common.phtml
 +
 +
<source lang="php">
 +
$this->macros('custom', 'setcurrency', array('USD'))
 +
</source>
 +
 +
или
 +
 +
<source lang="php">
 +
$this->macros('custom', 'setcurrency')
 +
</source>
 +
 +
для смены валюты отображения цен на валюту по умолчанию.
 +
 +
===AJAX запрос===
 +
 +
Так же сменить валюту на сайте можно AJAX запросом на адрес:
 +
 +
http://mysite.ru/udata://custom/setcurrency/USD/
 +
 +
Для изменения цен на сайте необходимо после запроса перезагрузить страницу.
 +
 
[[Категория:Модуль Интернет магазин]][[Категория:Написание кастомных макросов]]
 
[[Категория:Модуль Интернет магазин]][[Категория:Написание кастомных макросов]]

Версия 13:12, 9 февраля 2019

Актуально для версии 20.

Задача

Изменение валюты в которой отображаются цены на сайте на доллары (USD), евро (EUR) или любую другую.

Решение

Для реализации данной задачи, версия системы должна быть не ниже 2.8.4.

В конфигурационном файле (config.ini) установим валюту по умолчанию, допустим: default-currency = "RUR", а для автоматического переключения валюты на сайте, воспользуемся кастомным макросом, который пропишем в файле /classes/modules/custom.php для старой реализации модулей или /classes/components/custom.php для новой реализации модулей , после слов: //TODO: Write your own macroses here

public function setcurrency($currencyCode = 'RUR'){
	$inst = cmsController::getInstance()->getModule("emarket");
   
	$selectedCurrency = $inst->getCurrency($currencyCode);
  
	if($currencyCode && $selectedCurrency) {
		$defaultCurrency = $inst->getDefaultCurrency();

		if(permissionsCollection::getInstance()->isAuth()){
			$customer = customer::get();
			if($customer->preffered_currency != $selectedCurrency->id) {
				if($selectedCurrency->id == $defaultCurrency->id) {
					$customer->preffered_currency = null;
				} else {
					$customer->preffered_currency = $selectedCurrency->id;
				}
				$customer->commit();
			}
		} else {
			setcookie('customer_currency', $selectedCurrency->id, (time() + 2678400), '/');
		}
	}
}

TPL шаблонизатор

Вызов макроса необходимо прописать в шаблонах страниц, допустим в любом месте тэга <body>. Для tpl шаблонов вызов следующий:

%custom setcurrency('USD')%

или

%custom setcurrency()%

для смены валюты отображения цен на валюту по умолчанию.

В результате, при использовании макроса:

%emarket price(%id%, 'short')%

цена будет указана в валюте, выбор которой был сделан в кастомном методе setcurrency(), 'short' - два шаблона, в папках:

  • \tpls\emarket\
  • \tpls\emarket\currency\

XSLT шаблонизатор

Для XSLT-Шаблонизатора, необходимо в основном xsl-шаблоне сайта, в котором прописан тег head и body, необходимо прописать вызов:

<xsl:value-of select="document('udata://custom/setcurrency/USD/')" />

или

<xsl:value-of select="document('udata://custom/setcurrency/')" />

для смены валюты отображения цен на валюту по умолчанию.

в теге head.

PHP шаблонизатор

В PHP шаблонизаторе нужно вызвать этот макрос перед тем как отображать цены товаров.

Оптимальным вариантом будет вызвать его в точке входа в шаблон, например для шаблона demomarket это будет файл

/templates/demomarket/php/common.phtml

$this->macros('custom', 'setcurrency', array('USD'))

или

$this->macros('custom', 'setcurrency')

для смены валюты отображения цен на валюту по умолчанию.

AJAX запрос

Так же сменить валюту на сайте можно AJAX запросом на адрес:

http://mysite.ru/udata://custom/setcurrency/USD/

Для изменения цен на сайте необходимо после запроса перезагрузить страницу.