Drupal Commerce. Работа с валютами, ценами и форматами цен

Drupal: 
Уровень сложности: 
Модули: 

Друпал Коммерц работает с разными валютами, поле цена является настраиваемым и может отображаться с копейками и без копеек, с префиксом или суффиксом, быть перечёркнутой по акции. Обо всём подробнее.

Перевод поля Price, Order Total смотрите в уроке "Базовая настройка Drupal Commerce".

Мультивалютный магазин Drupal Commerce

После установки мультивалютности Друпал будет автоматически подгружать текущий курс обмена для каждой валюты (регулярно), поэтому задавать курс вручную не обязательно, хотя можно. Мультивалютность реализуется модулем Commerce Multicurrency, который позволяет использовать несколько валют и конвертировать цены в валюты в соответствии с текущим курсом.

Настройки валют выполняются: Магазин - Конфигурация - Настройки валюты : /admin/commerce/config/currency

Модуль Commerce Multicurrency добавляет два блока выбора валюты: в выпадающем списке (Currency Selector) или ссылками меню (Currency Menu Selector).

Иногда после установки мультивалютности если выбирать другую валюту магазина (в блоке выбора), то цены для гривен, белорусских рублей не меняются и остаются равны тому числу, которое задано в поле цена для другой валюты. Это может происходить если вы не настроили валюты Магазин - Конфигурация - Настройки валюты, а также если Друпал не смог загрузить курсы валют.

Проблема: Курсы валют гривна, белорусский рубль и другие не всегда грузятся, потому что по умолчанию Drupal использует источником курсов валют Центральный Европейский Банк.
Решение: Для автозагрузки курсов валют для гривен, белорусских рублей, тенге (и других СНГ стран) нужно использовать вместо Центрального Европейского Банка источником текущих курсов валют - Центральный Российский Банк (ЦРБ) - для этого есть модуль Commerce Multicurrency provider for RUB.
Выбор ЦРБ после установки модуля производится тут: /admin/commerce/config/currency/conversion

 

Устанавливать разные цены для разных валют

Если вам не нужен для некоторых товаров эквивалент в другой валюте, а нужно задавать разные цены для валют, тогда нужно настроить поле Цена коммерческого продукта для ввода нескольких значений.
Это нужно, например, если для Европы цены в евро отличаются от цен для России в рублях.
Видеоинструкция на английском: https://commerceguys.com/blog/commerce-module-tuesday-commerce-multicurr...

 

Расширенные настройки валют

Commerce Currency Settings - модуль, который добавляет больше настроек для валют: количество знаков после запятой, значок валюты, отображение знака валюты до или после цены (суффикс или префикс), разделитель тысяч, разделитель целой и дробно части и другие настройки.
Настройки валют этим модулем расположены в Магазин (Commerce) - Конфигурация - Настройки валюты - Настройка валюты (Custom Currence settings), то есть тут /admin/commerce/config/currency/custom-settings
Этот модуль не позволяет убрать отображение чисел после запятой, так как нельзя задать 0 знаков в поле Decimals (десятичные). Знаки для рублей могут появляться при конвертации цены, установленной в другой валюте, в рубли. Для стирания знаков после запятой пользуйтесь рекомендацией ниже.

 

Убираем копейки для рублей, гривен и белорусских рублей, но оставляем для евро и долларов

Убрать числа после запятой для рублей, гривен в ценах товаров, корзине для одновалютного магазина - модулем Commerce Extra Price Formatters, а для мультивалютного магазина - своим хуком.

  1. Модуль Commerce Extra Price Foramtters добавляет формат отображения для поля Цена. После установки модуля откройте Менеджер Дисплея и для всех типов товаров в поле Цена пропишите формат Price with no decimals, а также для всех полей Представлений. - Проблема в том, что если ваш магазин мультивалютный, то не для всех валют нужно убирать копейки, а этот модуль убирает копейки для всех валют без вариантов.

  2. Решение с помощью хука описано тут: http://dru.io/question/1015 - последний комментарий тлито а именно вот такой код:

Следующий код убирает копейки для трёх валют: RUB - рубли, UAH - гривны, BYR - белорусские рубли. Можете удалить ненужную строку с валютами RUB, UAH, BYR или добавить аналогичные строки с кодами других валют, например KZT - для тенге. Для других валют, не затронутых модулем, цены будут отображаться с долевой составляющей или как у вас настроено в форматах отображения.

  1. /**
  2.  * Implements hook_commerce_currency_info_alter().
  3.  */
  4. function commerce_my_price_decimals_formatter_commerce_currency_info_alter(&$currencies, $langcode) {
  5. $currencies['RUB']['format_callback'] = 'commerce_my_price_decimals_formatter_currency_format';
  6. $currencies['UAH']['format_callback'] = 'commerce_my_price_decimals_formatter_currency_format';
  7. $currencies['BYR']['format_callback'] = 'commerce_my_price_decimals_formatter_currency_format';
  8. }
  9.  
  10. /**
  11.  * Currency format callback.
  12.  */
  13. function commerce_my_price_decimals_formatter_currency_format($amount, $currency, $object) {
  14. $round_amount = commerce_currency_round(abs($amount), $currency);
  15. $price = number_format($round_amount, 0, $currency['decimal_separator'], $currency['thousands_separator']);
  16.  
  17. $replacements = array(
  18. '@code_before' => $currency['code_placement'] == 'before' ? $currency['code'] : '',
  19. '@symbol_before' => $currency['symbol_placement'] == 'before' ? $currency['symbol'] : '',
  20. '@price' => $price,
  21. '@symbol_after' => $currency['symbol_placement'] == 'after' ? $currency['symbol'] : '',
  22. '@code_after' => $currency['code_placement'] == 'after' ? $currency['code'] : '',
  23. '@negative' => $amount < 0 ? '-' : '',
  24. '@symbol_spacer' => $currency['symbol_spacer'],
  25. '@code_spacer' => $currency['code_spacer'],
  26. );
  27.  
  28. return trim(t('@code_before@code_spacer@negative@symbol_before@price@symbol_spacer@symbol_after@code_spacer@code_after', $replacements));
  29. }

 

Мультивалютность и мультиязыность

Изменение валюты для языковых версий сайта

Первый визит посетителя сайта обычно открывает нужную языковую версию, потому что посетитель нашёл в поисковой системе нужную ему страницу на нужном языке. Тогда и валюту нужно установить соответствующую этому языку сразу при первом посещении автоматически. Так происходит, например, на aliexpress.com, а на etsy.com лично мне он показывает валюту доллар, хотя язык русский. Как это настроить далее.
Многие сайты также добавляют всплывающее окно внизу или вверху, сообщающее об использовании куки и установке языка и валюты пользователя, с предложением исправить.
Пример как выглядит окно подсказки внизу на etsy.com при первом визите:

etsy multicurrency multilingual

Как выбирать валюту сразу решено в двух местах, наиболее правильный способ: http://dru.io/question/2945 - настроено через Rules, и какое-то время это работало, но как видно перестало по непонятным причинам.
Следующий аналогичный способ, но с применением PHP Filter (небезопасного модуля): https://drupalcommerce.org/discussions/2474/how-would-i-go-about-setting...

По непонятным причинам оба варианта не работают на моём сайте: все правила для валют срабатывают на любом языке, в итоге показываются товары с ценой в той валюте, правило которой сработало последним.

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