Приветствую на страницах нашего сайта.
Очень часто клиенты которые используют на своем сайте несколько валют, задаются вопросом о том как отобразить цену товара сразу в нескольких валютах в карточке товара.
По умолчанию opencart дает возможность смены валюты только в шапке по всему сайту, но очень многие пользователи не догадываются выбрать нужную валюту и переключить сайт на нее, по этому сегодня мы поговорим как же все таки визуально отобразить цены в нескольких валютах сразу возле основной цены.
Пример того что в итоге получится вы можете посмотреть на фото ниже:
Как я уже писал ранее opencart по умолчанию не предусматривает отображение разных валют в карточке товара , но функция convert присутствует в классе currency:
1
|
public function convert($value, $from, $to)
|
Данная функция используется движком когда вы меняете валюту из шапки магазина, конвертация из гривни к примеру в доллар происходит следующим образом:
1
|
$this->currency->convert($product_info['price'], 'UAH', 'USD')
|
Ну что же с основными принципами разобрались теперь давайте приступим к практике и выведем разные валюты возле цены.
В первую очередь хочу отметить что все действия мы будем производить на дефолтном шаблоне , и по умолчанию у нас стоит валюта Гривна, а дополнительные валюты это рубль и доллар, вот их мы и будем показывать.
1. Выводим разные валюты в карточку товара:
Изменения будем вносить в два файла:
1
2
|
catalog/view/theme/default/template/product/product.tpl
catalog/controller/product/product.php
|
и так открываем файл product.tpl и в нем ищем код который отвечает за отображение цены а именно:
1
|
<?php echo $price; ?>
|
И после него добавляем код:
1
2
3
4
|
//Для доллара:
<span id="price_2"><?php echo $price_2; ?></span>
//Для Рубля:
<span id="price_3"><?php echo $price_3; ?></span>
|
Если вам нужно выводить только что то одно то просто указываем нужную стоку.
Таким образом мы добавили вывод цены для стандартной цены в которой нет акций.
Теперь нам нужно еще добавить вывод для цен в которых указанна аукционная цена, в том же файле находим код:
1
|
<span class="price-old"><?php echo $price; ?></span> <span class="price-new"><?php echo $special; ?></span>
|
И после него добавляем:
1
2
3
4
|
//Для доллара:
<span class="price-old"><?php echo $price_2; ?></span> <span class="price-new"><?php echo $special_2; ?></span>
//Для рубля:
<span class="price-old"><?php echo $price_3; ?></span> <span class="price-new"><?php echo $special_3; ?></span>
|
Все с файлом product.tpl мы закончили, тем самым мы добавили вывод цены в двух дополнительных валютах.
Теперь нам нужно еще откорректировать файл product.php.
и так открываем его и ищем код:
1
|
$this->data['price'] = $this->currency->format($this->tax->calculate($product_info['price'], $product_info['tax_class_id'], $this->config->get('config_tax')));
|
который отвечает за нашу цену по умолчанию и после него добавляем:
1
2
|
$this->data['price_2'] = "($".round($this->currency->convert($product_info['price'], 'UAH', 'USD'), '2').")";
$this->data['price_3'] = "(".round($this->currency->convert($product_info['price'], 'UAH', 'RUB'), '0')." руб.)";
|
Таким образом мы указали что нам нужно отобразить дополнительную цену, но это только опять же касается только цены которая без акции, а чтобы дополнительные валюты показывались еще и в товарах с акцией находим код:
1
|
$this->data['special'] = $this->currency->format($this->tax->calculate($product_info['special'], $product_info['tax_class_id'], $this->config->get('config_tax')));
|
И после него добавляем:
1
2
|
$this->data['special_2'] = "($".round($this->currency->convert($product_info['special'], 'UAH', 'USD'), '2').")";
$this->data['special_3'] = "(".round($this->currency->convert($product_info['special'], 'UAH', 'RUB'), '2')." руб.)";
|
В данных строчках кода функция round(...) позволяет округлить цены до значения 2, вы же можете указать 0 если не хотите после запятой показывать копейки.
Вот в принципе и все , теперь у нас в карточке товара будет отображаться стоимость товара как в цене по умолчанию ( гривне) так и в дополнительных валютах доллар и рубль пример на фото выше.
и так с карточкой товара мы закончили, но у нас есть еще много других мест где отображается цена, давайте рассмотрим другие места вывода валюты цен.
Давайте отобразим несколько наших валют в модулях к примеру новинки, рекомендуемые, хити продаж и т. д... для всех них принцип одинаков, по этому возмем за основу модуль новинки, для всех остальных действия аналогичные.
2. Показываем разные валюты цены в модулях( Новинки)
Изменения будем вносить в два файла:
1
2
|
catalog/view/theme/default/template/module/latest.tpl
catalog/controller/module/latest.php
|
Первым делом открываем файл latest.tpl и в нем укажем место где мы будем выводить нашу цену, находим первый код:
1
|
<?php echo $product['price']; ?>
|
и после него добавляем следующее:
1
2
|
<span id="price_2"><?php echo $price_2; ?></span>
<span id="price_3"><?php echo $price_3; ?></span>
|
Таким образом вы вывели отображение дополнительной цены валюты в нужном нам месте модуля, для цены которая не имеет акции, теперь находим кусок кода который отвечает за аукционную цену:
1
|
<span class="price-old"><?php echo $product['price']; ?></span> <span class="price-new"><?php echo $product['special']; ?></span>
|
И после него добавим нужные нам валюты:
1
2
|
<span id="price_2"><?php echo $price_2_special; ?></span>
<span id="price_3"><?php echo $price_3_special; ?></span>
|
Все теперь можно приступить и к самому контролеру, то есть открываем файл latest.php, и в нем ищем вывод цены, после которого и нам нужно добавить кусок нужного нам кода:
И так находим:
1
2
|
if (($this->config->get('config_customer_price') && $this->customer->isLogged()) || !$this->config->get('config_customer_price')) {
$price = $this->currency->format($this->tax->calculate($result['price'], $result['tax_class_id'], $this->config->get('config_tax')));
|
И после добавляем код:
1
2
|
$this->data['price_2'] = "($".round($this->currency->convert($result['price'], 'UAH', 'USD'), '2').")";
$this->data['price_3'] = "(".round($this->currency->convert($result['price'], 'UAH', 'RUB'), '2')."руб.)";
|
Теперь нам нужно сделать все то же самое и для аукционной цены, находим код:
1
2
|
if ((float)$result['special']) {
$special = $this->currency->format($this->tax->calculate($result['special'], $result['tax_class_id'], $this->config->get('config_tax')));
|
И после него добавляем:
1
2
|
$this->data['price_2_special'] = "($".round($this->currency->convert($product_info['special'], 'UAH', 'USD'), '2').")";
$this->data['price_3_special'] = "(".round($this->currency->convert($product_info['special'], 'UAH', 'RUB'), '2')."руб.)";
|
Ну вот в принципе и все, теперь у вас в модуле новинки будет отображаться цена в разных валютах, другие модули делаете по аналогии.
ВАЖНО: в некоторых других модулях используйте $product_info вместо $result все остальное по аналогии.
Теперь нам нужно сделать еще возможность отображения валют в категориях, поиске, странице акций, производителях и т.д...
За пример мы берем именно страницу категорий товара, остальное делаем так же.
И так давайте сделаем отображение валюты в категории товаров.
3. Показываем разные валюты цены в категории товаров
В категории мы будем использовать немного другой код для отображения дополнительной валюты, но тоже ничего нет сложного.
Изменения будем вносить в два файла а именно в:
1
2
|
catalog/view/theme/default/template/product/category.tpl
catalog/controller/product/category.php
|
Ну что же приступим.
Открываем файл category.tpl и ищем вывод цены товара без акции:
1
|
<?php echo $product['price']; ?>
|
после данного кода добавляем:
1
2
|
<br>( <span id="price_2"><?php echo $product['price_2']; ?></span> /
<span id="price_3"><?php echo $product['price_3']; ?></span> )
|
Для отображения валюты к товарам с акцией ищем код:
1
|
<span class="price-old"><?php echo $product['price']; ?></span> <span class="price-new"><?php echo $product['special']; ?></span>
|
И после него добавляем:
1
2
|
<br>( <span id="price_2"><?php echo $product['price_2_special']; ?></span> /
<span id="price_3"><?php echo $product['price_3_special']; ?></span> )
|
Все с файлом category.tpl закончили, теперь приступим к контролеру, и так открываем файл category.php и ищем код:
1
|
$price = $this->currency->format($this->tax->calculate($result['price'], $result['tax_class_id'], $this->config->get('config_tax')));
|
и после него добавляем:
1
2
3
|
// Дополнительная валюта
$price_2 = $this->currency->format($this->tax->calculate($result['price'], $result['tax_class_id'], $this->config->get('config_tax')), 'USD');
$price_3 = $this->currency->format($this->tax->calculate($result['price'], $result['tax_class_id'], $this->config->get('config_tax')), 'RUB');
|
Там же немного ниже после кода:
1
|
$price = false;
|
Добавляем:
1
2
|
$price_2 = false;
$price_3 = false;
|
Теперь все тоже самое нам нужно добавить и для товара с акционной ценой, ищем чуть ниже код:
1
|
$special = $this->currency->format($this->tax->calculate($result['special'], $result['tax_class_id'], $this->config->get('config_tax')));
|
и после него добавляем:
1
2
3
|
// Дополнительная валюта для акций
$price_2_special = $this->currency->format($this->tax->calculate($result['special'], $result['tax_class_id'], $this->config->get('config_tax')), 'USD');
$price_3_special = $this->currency->format($this->tax->calculate($result['special'], $result['tax_class_id'], $this->config->get('config_tax')), 'RUB');
|
И немного ниже после кода:
1
|
$special = false;
|
Добавляем следующее:
1
2
|
$price_2_special = false;
$price_3_special = false;
|
Далее опускаемся ниже и ищем код:
1
|
'price' => $price,
|
и сразу после него добавляем:
1
2
3
4
5
|
// Дополнительная валюта
'price_2' => $price_2,
'price_3' => $price_3,
'price_2_special' => $price_2_special,
'price_3_special' => $price_3_special,
|
Ну вот в принцыпе и все, теперь у нас в категории в списке товаров рядом с ценой будет отображатся дополнительная валюта, с страницами поиска , производителей, акций и.т.д... делаем все по аналогии.
Общим пробуйте , тестируйте и все у вас получится, а если что не получается спрашивайте в комментариях.
4 комментария
Я извиняюсь, а как это будет в корзине отображаться?
В корзине будет отображена та валюта, которая выбрана в самом магазине, данный пример только выводит для отображения цены в других валютах!
А есть какое-либо решение что -бы в корзине отображать 2 цены. Будь то 2 валюты, или «акционная» ценна и оригинальная.
Только делать отдельно. Там больше правок нужно делать , так как проверок больше чем в отображении самой карточки! Хотя если поискать в сети то возможно и какой то готовый модуль найти можно, мне такой кажись не встречался!