Drupal → Убрать копейки из цен в Commerce

23.04.2014

Глобально убрать копейки из рублёвых цен:

Commerce 1

/**
 * Implements hook_commerce_currency_info_alter().
 */
function MODULENAME_commerce_currency_info_alter(&$currencies, $langcode) {
  // Запрещаем оперировать копейками
  $currencies['RUB']['rounding_step'] = 1;

  // Удаляем копейки из вывода
  $currencies['RUB']['format_callback'] = 'MODULENAME_rub_currency_format';
}

/**
 * Currency format callback.
 */
function MODULENAME_rub_currency_format($amount, $currency, $object) {
  $round_amount = commerce_currency_round(abs($amount), $currency);
  $price = number_format($round_amount, 0, $currency['decimal_separator'], $currency['thousands_separator']);

  $replacements = array(
    '@code_before' => $currency['code_placement'] == 'before' ? $currency['code'] : '',
    '@symbol_before' => $currency['symbol_placement'] == 'before' ? $currency['symbol'] : '',
    '@price' => $price,
    '@symbol_after' => $currency['symbol_placement'] == 'after' ? $currency['symbol'] : '',
    '@code_after' => $currency['code_placement'] == 'after' ? $currency['code'] : '',
    '@negative' => $amount < 0 ? '-' : '',
    '@symbol_spacer' => $currency['symbol_spacer'],
    '@code_spacer' => $currency['code_spacer'],
  );

  return trim(t('@code_before@code_spacer@negative@symbol_before@price@symbol_spacer@symbol_after@code_spacer@code_after', $replacements));
}

Если нужно убрать вывод копеек в отдельных полях, то поможет модуль Commerce Price Decimals Formatter.

Commerce 2

Во втором комерце достаточно в настройках валюты admin/commerce/config/currencies установить опцию Fraction digits в 0 .

Написанное актуально для
Commerce 1, Commerce 2
Похожие записи

Комментарии

Гость
20.05.2014, 14:12

А какой смысл делать лишние телодвижения если все остальное работает по дефолту. Перепроверил, оказывается коммерс хранит цены в копейках.

т. е. если до преобразования цена была написана как 5,00 то в базе она хранится как 500 копеек.

а после

$currencies['RUB']['decimals'] = 0;

в базе по сути хранятся не копейки а рубли. Если не прав надеюсь автор поправит.

Игорь
18.08.2014, 21:40

Огромнейшее спасибо-все работает! И вьюшки и поля и вся лабуда... Вы батюшка, гений!

Гость
15.09.2014, 21:24

Неужели из-за такой дребедени нужно добавлять модуль,чтоб получить callback функцию. Мне, к примеру, нужно всего лишь обернуть symbol (руб.) в span. Нельзя ли как-то проще, но "правильно" сделать в теме?

Костя
13.12.2014, 08:01

При выводе поля Price в слайдер с помощью search_api_ranges всё равно отображаются копейки.

Гость
01.09.2016, 14:00

Подскажите, а где именно (в каком документе) нужно разместить этот код?

Павел
13.04.2017, 15:28

Использую этот хук в template.php темы также для оборачивания спаном руб. Все бы хорошо но имеются проблема на административных страницах редактирования товара Error: Call to undefined function custom_commerce_currency_format(). Если добавляю функцию также в шаблон админки начинает работать редактирование, но перестает заходить в конфигурацию.

Подскажите, пожалуйста, прописываю, сбрасываю кеш, создаю новый товар, сохраняю, при редактировании всё равно отображаются копейки.
В чем может быть проблема?

Василий
22.06.2019, 12:13

Для Drupal 8 и commerce 2 можно переопределить сервис commerce_price.currency_formatter, добавив в опции по умолчанию:
'minimum_fraction_digits' => 0

Андрей
12.01.2020, 21:06

Приветствую. Спасибо за решение!
Подскажите, пожалуйста, следующий момент. В паре с вашим решением использую модуль https://www.drupal.org/project/commerce_discount. И вот с какой проблемой столкнулся. Пример: цена товара 1042р., скидка 6%, цена со скидкой 979р. - так это выглядит для пользователя. В БД цена хранится в копейках и выглядит так: цена 104200, скидка -6252, цена со скидкой 97948. Если добавить в корзину два таких товара, то цена в копейках будет равной 97948*2=195896 и округлится до 1959р. Пользователь в корзине видит лишний рубль — 979*2=1959. Я понимаю, что где-то нужно добавить округление, но вот где...
Спасибо за любую помощь.

Максим
01.04.2020, 15:23

Drupal 8
Я меня была проблема с выводом цены search api через views (выводило в конце суммы четыре ноля)
Решено переопределение поля во views с использованием фильтра twig(https://twig.symfony.com/doc/3.x/filters/slice.html)
Пример удаляет последние 4 знака строки:
{{ number | slice(0, -4) }}

{{ nuber}} - это поле цены из подстановочного шаблона для переопределения.

Добавить комментарий