- Introduction
- Requirements
- Installation
- Configuration
- Exchange rates
- Maintainers
Enhancement for handling multi-currency in Drupal 8 for Drupal Commerce.
Drupal Commerce 2 supports multiple currencies out of the box. But only for adding prices, not resolving multiple currency prices/orders based on some criteria.
Commerce currency resolver tries to solve resolving prices per currency, calculating those prices and exchange rates between currencies.
This module requires Commerce Exchanger, Drupal Commerce 2 and it's submodule price.
Install the Commerce Currency Resolver module as you would normally install any Drupal contrib module. Visit https://www.drupal.org/node/1897420 for further information.
1. Navigate to Administration > Extend and enable the Commerce Currency
Resolver module.
2. Navigate to Home > Administration > Commerce > Configuration
> Currency resolver.
3. Choose from available options settings to configure how currency should
be resolved, how prices are calculated and default currency.
4. Navigate to the "Conversion" tab for configuration related
to Exchange rates.
5. Navigate to the "Mapping" if available and selected which currency
should be used per language or country.
Currency resolver module works with "Internal Dynamic Page Cache" only.
Page Cache module needs to be disabled.
The Drupal core Page Cache module does not work with personalized "content". Dynamic Page Cache is built for that purpose.
Explanation - https://www.drupal.org/project/commerce_currency_resolver/issues/3042307#comment-13046326
Handled trough Commerce Exchanger module https://www.drupal.org/project/commerce_exchanger
If you are using commerce shipping there are two options how shipping methods can be set to work with currency resolver.
- If you are using condition Order currency and the selected currency matches to the price currency selected under Rate amount then you don't need to do anything.
- If you need to auto-calculate price or have multiple prices per shipping method you need enable submodule commerce_currency_resolver_shipping.
If you are adding order items programmatically in your code, you need take in account possible conflicts with prices. To avoid that is best that you using resolver to resolve prices for certain item to the cart.
Example below shows entire process in custom add to cart process, where we add item to the cart.
**
@var \Drupal\commerce_cart\CartManagerInterface $cart_manager */
$cart_manager = \Drupal::service('commerce_cart.cart_manager');
/** @var \Drupal\commerce_order\Resolver\OrderTypeResolverInterface $order_type_resolver */
$order_type_resolver = \Drupal::service('commerce_order.chain_order_type_resolver');
/** @var \Drupal\commerce_store\CurrentStoreInterface $current_store */
$current_store = \Drupal::service('commerce_store.current_store');
/** @var \Drupal\commerce_cart\CartProviderInterface $cart_provider */
$cart_provider = \Drupal::service('commerce_cart.cart_provider');
/** @var \Drupal\commerce_order\OrderItemStorage $order_item_storage */
$order_item_storage = \Drupal::service('entity_type.manager')->getStorage('commerce_order_item');
$store = $current_store->getStore();
$context = $context = new Context(\Drupal::currentUser(), $store);
$resolved_price = \Drupal::service('commerce_currency_resolver.price_resolver')->resolve($product, 1, $context);
$order_item = $order_item_storage->createFromPurchasableEntity($product, ['unit_price' => $resolved_price]);
$order_type_id = $order_type_resolver->resolve($order_item);
$cart = $cart_provider->getCart($order_type_id, $store);
if (!$cart) {
$cart = $cart_provider->createCart($order_type_id, $store);
}
$cart_manager->addOrderItem($cart, $order_item);
The 8.x-1.x branch was created by:
- Valentino Medimorec (valic) - https://www.drupal.org/u/valic
This module was created and sponsored by Foreo, Swedish multi-national beauty brand.
- Foreo - https://www.foreo.com/