Как узнать цену товара во всех разрешенных валютах?

10

У меня есть настройки с двумя представлениями магазина.

Первый вид магазина имеет базовую и единственную валюту, установленную на USD. Второй имеет 2 разрешенные валюты - доллар США и евро. По умолчанию отображается евро, доллар США - базовый.

Цены на все товары устанавливаются только в долларах США, а курс обмена евро составляет 0,75. Цена продукта, скажем, 14 долларов.

И мой код идет:

// Store ID 2 - default currency EUR, base currency USD
// $product is instance of Magento\Catalog\Model\Product
$priceInfo = $product->getPriceInfo();
$price = $priceInfo->getPrice('regular_price')->getValue();

Этот код всегда выбирает правильную цену (10.50) в евро. Но мне нужны обе цены - в долларах и в евро, но я не нашел способа передать валюту каким-либо getPriceспособом.

Я пытался использовать Magento\Directory\Helper\Dataдля преобразования:

$helper->currencyConvert($price, 'EUR', 'USD');

Но это дает мне $ 13,99, когда реальная цена в долларах США составляет $ 14 - поэтому расчет неверен.

Знаете ли вы, как я могу узнать цены товара для обеих валют магазина? Большое спасибо!

Ян Петр
источник

Ответы:

1

Когда вы чувствуете, что «вычисления неверны», это всегда помогает взглянуть на исходный код. Когда я смотрю \Magento\Directory\Model\Currency::convert()(это внутренний метод, который \Magento\Directory\Helper\Data::currencyConvert()использует), я вижу что-то интересное:

public function convert($price, $toCurrency = null)
{
    if ($toCurrency === null) {
        return $price;
    } elseif ($rate = $this->getRate($toCurrency)) {
        return $price * $rate;
    }

Это означает, что он преобразует цену в курс, установленный в $toCurrency. В вашем примере вы конвертируете EUR в USD. Я думаю, что курс доллара составляет 1,00, поэтому, когда вы конвертируете 14 долларов США * 1,00, вы получаете 13,99 (полагаю, это связано с тем, как работают плавающие числа?).

Как это решить? Итак, у вас есть базовая цена в долларах США, и вы знаете, что курс евро составляет 0,75, поэтому, если у вас есть код, который выбирает базовую цену вашего продукта, загружает курс евро и умножает его на то, что вы можете перейти , Например:

$basePrice = $product->getPrice();
$currency  = $currencyFactory->create()->load('EUR');
$eurPrice  = $currency->convert($basePrice, 'EUR');

Я еще не проверял его, поэтому я не уверен, что он работает, только следуя коду. Но, возможно, это поможет вам найти решение.

Гиль Беркерс
источник
1

Пожалуйста, используйте ниже код

$objectManager = \Magento\Framework\App\ObjectManager::getInstance();
$productId = 46;
$product = $objectManager->create('Magento\Catalog\Model\Product')->load(productId );
$price = $product->getFinalPrice();
$currency = $objectManager->create('Magento\Directory\Model\Currency')->load('USD');
echo $currency->convert($price,'EUR');
Нилеш Госай
источник