OpenCart: отображать несколько валют для цены на карточке продукта (товара)

OpenCart: отображать несколько валют для цены на карточке продукта (товара) Иногда хочется вывести пользователю цену на продукт в разных валютах. На равне с рублём, показать рядышком ещё и автоматически конвертированную цену в евро или долларах.

Это не реализовано в стандартной сборке, но в классе currency есть встроенная функция convert:

public function convert($value, $from, $to)

Она используется, когда вы выбираете сменить валюту в шапке сайта на Opencart. Конвертация из рублей в доллары происходит так:

$this->currency->convert($product_info['price'], 'RUS', 'USD')

1. Реализуем вывод цены в евро (аналогично для долларов) на странице карточки товара.

(по умолчанию используем валюту рубли). Не забудьте, что в backend'е Opencart надо добавить и включить валюту доллара.

1)catalog/view/theme/default/template/product/product.tpl (около 38-й строки):
<span><?php echo $price; ?></span>
<span id="price_2"><?php echo $price_2; ?></span>
2) Дальше в catalog/controller/product/product.php (строка 227):
if (($this->config->get('config_customer_price') && $this->customer->isLogged()) || !$this->config->get('config_customer_price')) {
$this->data['price'] = $this->currency->format($this->tax->calculate($product_info['price'], $product_info['tax_class_id'], $this->config->get('config_tax')));
$this->data['price_2'] = "(&euro; ".round($this->currency->convert($product_info['price'], 'RUB', 'EUR'), '2').")";
} else {
$this->data['price'] = false;
}
Функция round(...) округляет цену до значения '2' (2 цифры после запятой).
 

2. Реализуем вывод цены в евро в модуле рекомендуемых товаров (featured).

Нисколько не сложнее.

1)catalog/view/theme/default/template/module/featured.tpl (после 14-й строки в двух местах добавить):

<div class="price">
          <?php if (!$product['special']) { ?>
          <?php echo $product['price']; ?>
 <span id="price_2"><?php echo $price_2; ?></span>
          <?php } else { ?>
          <span class="price-old"><?php echo $product['price']; ?></span> <span class="price-new"><?php echo $product['special']; ?></span> <span id="price_2"><?php echo $price_2_special; ?></span>
          <?php } ?>
        </div>

2) Дальше в catalog/controller/module/featured.php

(строка 29):

if (($this->config->get('config_customer_price') && $this->customer->isLogged()) || !$this->config->get('config_customer_price')) {
$price = $this->currency->format($this->tax->calculate($product_info['price'], $product_info['tax_class_id'], $this->config->get('config_tax')));
$this->data['price_2'] = "(&euro; ".round($this->currency->convert($product_info['price'], 'RUB', 'EUR'), '2').")";
} else {
$price = false;
}
(35 строка):
if ((float)$product_info['special']) {
$special = $this->currency->format($this->tax->calculate($product_info['special'], $product_info['tax_class_id'], $this->config->get('config_tax')));
$this->data['price_2_special'] = "(&euro; ".round($this->currency->convert($product_info['special'], 'RUB', 'EUR'), '2').")";
} else {
$special = false;
}
 

3. Реализуем вывод цены в евро в модуле последних добавленных товаров (latest)

Аналогично как и для рекомендованных товаров.

1)catalog/view/theme/default/template/module/latest.tpl (после 12-й строки в двух местах добавить):

<div class="price">
          <?php if (!$product['special']) { ?>
          <?php echo $product['price']; ?>
 <span id="price_2"><?php echo $price_2; ?></span>
          <?php } else { ?>
          <span class="price-old"><?php echo $product['price']; ?></span> <span class="price-new"><?php echo $product['special']; ?></span> <span id="price_2"><?php echo $price_2_special; ?></span>
          <?php } ?>
        </div>

2) Дальше в catalog/controller/module/latest.php

Здесь только название переменной принято $result, поэтому подстраиваемся (и в районе 32 строки заменяем на ):

 

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')));
$this->data['price_2'] = "(&euro; ".round($this->currency->convert($result['price'], 'RUB', 'EUR'), '2').")";
} else {
$price = false;
}

if ((float)$result['special']) {
$special = $this->currency->format($this->tax->calculate($result['special'], $result['tax_class_id'], $this->config->get('config_tax')));
$this->data['price_2_special'] = "(&euro; ".round($this->currency->convert($result['special'], 'RUB', 'EUR'), '2').")";
} else {
$special = false;
} 
 
(Ред. 30.11.2012):

4. Выводим цену в евро для страницы категории с товарами.

То, о чём обсуждали в комментариях, пишу по порядку (потому что было 3 похожих вопроса уже).
 
1)catalog/view/theme/default/template/product/category.tpl (район 78-88 строк)
 
<div class="price">
        <?php if (!$product['special']) { ?>
        <?php echo $product['price']; ?>
        <span id="price_2"><?php echo $price_2; ?></span>
        <?php } else { ?>
        <span class="price-old"><?php echo $product['price']; ?></span> <span class="price-new"><?php echo $product['special']; ?></span> <span id="price_2"><?php echo $price_2_special; ?></span>
        <?php } ?>
        <?php if ($product['tax']) { ?>
        <br />
2) catalog/controller/product/category.php
 
(примерно 163-173 строки)
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')));
$this->data['price_2'] = "(&euro; ".round($this->currency->convert($result['price'], 'RUB', 'EUR'), '2').")";
} else {
$price = false;
}

if ((float)$result['special']) {
$special = $this->currency->format($this->tax->calculate($result['special'], $result['tax_class_id'], $this->config->get('config_tax')));
$this->data['price_2_special'] = "(&euro; ".round($this->currency->convert($result['special'], 'RUB', 'EUR'), '2').")";
} else {
$special = false;
}  

(район 67-70 строк)

 

$category_id = array_pop($parts);
} else {
$category_id = 0;
}

$product_info = $this->model_catalog_product->getProduct($product_id);

$this->data['product_info'] = $product_info;

$category_info = $this->model_catalog_category->getCategory($category_id);
 
Источник: loco.ru

almix
Разработчик Loco, автор статей по веб-разработке на Yii, CodeIgniter, MODx и прочих инструментах. Создатель Team Sense.

Вы можете почитать все статьи от almix'а.



Другие статьи по этой теме:

Комментарии (15)     Подпишитесь на RSS комментариев к этой статье.

15 комментариев

#391
Дима говорит:
March 26, 2012 at 04:04 am
НЕ РАБОТАЕТ
#395
almix говорит:
March 26, 2012 at 02:56 pm
РАБОТАЕТ.
#398
ndnn говорит:
March 26, 2012 at 04:27 pm
Работает! Спасибо!
#499
Антон говорит:
June 12, 2012 at 11:19 am

Все работает отлично!

А подскажите еще как это сделать для категории товаров?  Заранее благодарю!

#500
almix говорит:
June 13, 2012 at 10:41 am

@Антон, то же самое добавляйте в код для категорий.

catalog/view/theme/default/template/product/category.tpl (около 89-й строки):

<div class="price">
        <?php if (!$product['special']) { ?>
        <?php echo $product['price']; ?>
        <?php } else { ?>
        <span class="price-old"><?php echo $product['price']; ?></span> <span class="price-new"><?php echo $product['special']; ?></span>
        <?php } ?>
        <?php if ($product['tax']) { ?>
        <br />

catalog/controller/product/category.php (около 173-й строки):

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')));
} else {
$price = false;
}
добавил объяснение в статью.
#516
Антон говорит:
June 14, 2012 at 04:41 pm

Пишет 

Undefined variable: product_info 

#529
Игорь говорит:
July 1, 2012 at 01:14 pm

Подскажите как вывести в категориях. Вы писали что вводить тоже самое что и в product.php

$this->data['price_2'] = "(&euro; ".round($this->currency->convert($product_info['price'], 'RUB', 'EUR'), '2').")";

но выдает ошибку так как там нет данных $product_info['price'], . Вопрос актуален как вывести тоже самое в категориях. Спасибо

#598
almix говорит:
August 2, 2012 at 11:47 am

Игорь и Антон, воткните в catalog/controller/product/category.php куда-н. около 70 строки:

$product_info = $this->model_catalog_product->getProduct($product_id);
$this->data['product_info'] = $product_info;

Посмотрите это из catalog/controller/product/product.php (строка 94).

добавил объяснение в статью.

#622
Макс говорит:
August 23, 2012 at 11:24 am

Простите almix, а можно инструкцию полностью, а то я уже запутался говорите вводите тоже самое и ниже даете вообще другой код (я попробовал только его вставить и ничего не выводится)
заранее спасибо за ответ

#624
almix говорит:
August 29, 2012 at 11:58 am

Макс, в статье жирным указаны строки. price_2 это то же что price, только конвертируется. Я дал код, В КОТОРЫЙ НАДО ДОБАВЛЯТЬ "то же самое"!!! Примерные места в коде, а добавлять то, что в статье для продуктов, теперь вам то же самое для категорий надо проделать. Комментарий #598 не забудьте.

добавил объяснение в статью.

#717
Владимир говорит:
November 29, 2012 at 10:04 am
Я сделал как написано, вроде бы все получилось. Но вот не задача: вторая цена показывается действительно значением в долларах но значок стоит от Евро. В валюте в админке все включено, а евро я вообще удалил. Вот как поставить чтоб отображался $ а не евро. И еще на скрине у вас показано что вторая цена выводится красным цветом, а у меня белым как и основная цена, как поменять цвет? Заранее спасибо!
#758
Никита говорит:
January 9, 2013 at 04:08 pm
Прошу прощения, сделал в категориях точно так же, ничего не забыл, но цена в 2 валюте отображается у всех одна - сконвертированая цена последнего товара.
#777
Сергей говорит:
February 10, 2013 at 04:43 pm
не работает с категорией, выводит одну цену для всех товаров - код вставил в точности как описано
#911
evgen говорит:
July 5, 2013 at 11:56 am
подскажите плз. цену вывел, но на странице категории везде одна и та же цена в скобках светится.
#1024
Андрей говорит:
November 6, 2013 at 03:09 pm

Подскажите пожалуйста, а как сделать так чтобы вторая валюта между тысячами пробел имела?

Сделал в {admin,catalog}/language/russian/russian.php
decimal_point, thousand_point

поставил пробел. Но в стандартной цене тысячи разделяются а в вашем коде нет.