Выбор валюты в интернет магазине на Modx(Evo) + Shopkeeper (мультивалютность)

Есть у меня интернет магазин на котором понадобилось организовать мультивалютность. Мультивалютность в плане выбора валюты посетителем.

Для этого понадобятся некоторые знания в области php и html.


Создаем в шаблоне поле с выбором валюты. Я организовал это в шапке в виде ссылок

<span style="border: 1px dotted #00C8F2; border-radius: 3px;" id="currSp">
<a class="currency" href="[[createUrl? &curren=`uah`]]">грн</a>  
<a class="currency" href="[[createUrl? &curren=`rur`]]">руб</a></span>

Затем создаем 3 сниппета: createUrl, getCurrency и countPrice.

Сниппет createUrl:


<?php
$output="";
$s = preg_match("/\?/", $_SERVER['REQUEST_URI']);
$param = preg_match("/\?curr=(rur|uah)/", $_SERVER['REQUEST_URI']);
if ($s!=0)
{
  if($param!=0)
    $a = preg_replace("/\?curr=(rur|uah)/", "", $_SERVER['REQUEST_URI'])."?curr=".$curren;
  else
    $a = preg_replace("/\&curr=(rur|uah)/", "", $_SERVER['REQUEST_URI'])."&curr=".$curren;

}
else
  $a = preg_replace("/\?curr=(rur|uah)/", "", $_SERVER['REQUEST_URI'])."/?curr=".$curren;

//$curr = $_SERVER['REQUEST_URI'];
//$a = substr($curr, -9);

$output=$a;
return $output;
?>

Как понятно из названия, он нужен для создания ссылки по которой будет формироваться get запрос с валютой.

Сниппет getCurrency нужен для чтения get запроса сформированным сниппетом выше:


<?php
$output="";

if (!isset($_SESSION['currency']))
    $_SESSION['currency']='rur';
else {
    if ($_SESSION['currency'] == 'rur')
        $a = 'руб.';
    else
        $a='грн.';
}

if (isset($_GET['curr']))
{
  if ($_GET['curr'] == 'uah'){
    $_SESSION['currency']='uah';
    $a = 'грн.';
  }
  else if ($_GET['curr']=='rur')
  {
    $_SESSION['currency']='rur';
    $a = 'руб.';
  }
}

//$_SESSION['shk_currency'] = $_SESSION['currency'];
$output=$a;
return $output;

?>

И наконец сниппет для пересчета цены:


<?php
$output="";
$price*=1;
if (isset($_SESSION['currency']))
{
    if ($_SESSION['currency']=='uah')
    {
        $price*=0.25;     
    }
}
$output=round($price);
return $output;
?>

Вместо 0,25 вы указываете свое значение по которому будет вестись пересчет.
У меня каталог заполнялся в рублях и потом переводился в гривны.

Теперь во всех шаблонах и ресурсах в местах вызова Shopkeeper вместо &currency=`руб.`, вы указываете &currency=`[!getCurrency!]`.

В шаблоне корзины, в шаблоне раздела и товара заменяете все вызовы плейсхолдеров [+price+] и [+currency+] на [!countPrice? &price=`[+price+]` !] и [[getCurrency]] соответственно.

Теперь нужно организовать саму корзину, чтоб в ней и общая сумма считалась по пересчитанным значениям. Для этого находим ваш шаблон корзины и ищем где выводится общая цена. Важно: в шаблонах корзины, там где выводится общая сумма оставляем [+price_total+] или [+total_price+].

Теперь перейдем к серверной части. Находим класс шопкипера. Он находится по адресу /assets/snippets/shopkeeper/classes/class.shopkeeper.php.

Находим функцию getTotal и вставляем вместо 
$totalPrice += $price*$count;

следующее:


if ($_SESSION['currency'] == 'uah')
       $totalPrice += round($price*0.25)*$count;
else
       $totalPrice += $price*$count;

Это требуется для расчета общей стоимости в корзине и для правильного формирования цен в письмах.

Теперь нужно разобраться с письмами. Находим шаблоны писем /assets/snippets/shopkeeper/module/templates/mail_shipped.tpl и /assets/snippets/shopkeeper/module/templates/mail_changeStatus.tpl и в них меняем строки


<ul>
[+loop+]  <li>[+<s>+]<b><a href="[+link+]" target="_blank">[+name+]</a></b> ([+price+])[+addit_data+] <b> x [+count+] шт.</b>[+</s>+]</li>
[+end_loop+]
</ul>

на
<ul>
[+loop+]
  <li>[+<s>+]<b><a href="[+link+]" target="_blank">[+name+]</a></b> ([[countPrice? &price=`[+price+]` ]])[+addit_data+] <b> x [+count+] шт.</b>[+</s>+]</li>
[+end_loop+]
</ul>

Теперь на всех страницах, где вызывается корзина и выводятся товары, в настройках страницы снимаем галочку с "кешируемый".

Вот в принципе и все.

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

Отправить комментарий