Jak uzyskać cenę produktu we wszystkich dozwolonych walutach?

10

Mam konfigurację z dwoma widokami sklepu.

Pierwszy widok sklepu ma bazę i jedyną walutę ustawioną na USD. Drugi ma 2 dozwolone waluty - USD i EUR. Domyślnie wyświetlany jest EUR, USD jest ustawiony jako podstawowy.

Ceny wszystkich produktów są ustalane tylko w USD, a kurs wymiany EUR wynosi 0,75. Cena produktu to powiedzmy 14 USD.

A mój kod brzmi:

// 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();

Ten kod zawsze pobiera prawidłową cenę (10,50) w EUR. Potrzebuję jednak obu cen - w USD i EUR, ale nie znalazłem sposobu na przekazanie waluty jakiejkolwiek getPricemetodzie.

Próbowałem użyć Magento\Directory\Helper\Datado konwersji:

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

Ale daje mi 13,99 USD, gdy rzeczywista cena w USD wynosi 14 USD - więc obliczenia są błędne.

Czy wiesz, jak mogę uzyskać ceny produktów dla obu walut sklepu? Wielkie dzięki!

Jan Petr
źródło

Odpowiedzi:

1

Kiedy wydaje Ci się, że „obliczenia są nieprawidłowe”, zawsze pomaga spojrzeć na kod źródłowy. Kiedy patrzę na \Magento\Directory\Model\Currency::convert()( \Magento\Directory\Helper\Data::currencyConvert()używa to wewnętrznej metody ), widzę coś interesującego:

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

Oznacza to, że konwertuje cenę na stawkę ustawioną w $toCurrency. W twoim przykładzie przelicz EUR na USD. Myślę, że kurs wynosi 1,00 USD, więc kiedy konwertujesz 14 USD * 1,00, dostajesz 13,99 (Myślę, że jest to spowodowane tym, jak działają liczby zmiennoprzecinkowe?).

Jak to rozwiązać? Cóż, masz swoją cenę podstawową w USD i wiesz, że EUR ma stawkę 0,75, więc jeśli masz kod, który pobiera cenę podstawową twojego produktu, ładuje kurs EUR i mnoży go, że możesz ustawić . Na przykład:

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

Jeszcze go nie testowałem, więc nie jestem pewien, czy to działa, tylko postępuję zgodnie z kodem. Ale może pomoże ci to znaleźć rozwiązanie.

Giel Berkers
źródło
1

Prosimy użyć poniższego kodu

$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');
Nilesh Gosai
źródło