currency · Валюты 26.100.0 Заметное

Currency 26.100.0: у поля «Деньги» появилась своя валюта по умолчанию

2 мин чтения
Узнавайте о ломающих изменениях Битрикса раньше, чем они доедут до прода: свежие разборы — в канале @bxmax_updates

В currency 26.100.0 у пользовательского поля типа «Деньги» (money) появилась своя валюта по умолчанию. От неё зависит, в какую валюту запишется сумма без кода валюты и что форма покажет у пустого значения. Публичный API не менялся, но если ваш код пишет в такие поля голые числа, после пересохранения настроек поля они могут уйти в другую валюту.

Новое

Задайте полю валюту по умолчанию

Настройка называется SETTINGS['DEFAULT_CURRENCY']. В админке это валюта в селекторе рядом со значением по умолчанию. Теперь она сохраняется, даже если сумму оставить пустой.

Раньше значение без валюты (100 вместо 100|RUB) в нестрогом формате всегда получало базовую валюту. Теперь MoneyType::onBeforeSave() сначала смотрит на DEFAULT_CURRENCY поля, а базовую берёт, только если настройки нет или такой валюты не существует. У старых полей этого ключа нет, так что до пересохранения настроек они пишут суммы как раньше.

Настройки при сохранении проходят через prepareSettings(). Если в DEFAULT_VALUE указана существующая валюта, метод запишет её в DEFAULT_CURRENCY, что бы вы ни передали отдельно. Поле со значением по умолчанию 100|USD после пересохранения начнёт записывать 100 как 100|USD. У суммы без валюты в DEFAULT_VALUE или с кодом не из трёх заглавных латинских букв метод подставит базовую, и она же станет DEFAULT_CURRENCY.

Создаём поле с валютой и смотрим, во что превратится число без валюты:

        <?php declare(strict_types=1);

use Bitrix\Currency\UserField\Types\MoneyType;
use Bitrix\Main\Loader;
use Bitrix\Main\SystemException;

Loader::requireModule('currency');

global $APPLICATION, $USER_FIELD_MANAGER;

$entityId = 'HLBLOCK_3'; // ваш хайлоадблок
$fieldName = 'UF_BUDGET';

$fieldId = (int)(new CUserTypeEntity())->Add([
    'ENTITY_ID' => $entityId,
    'FIELD_NAME' => $fieldName,
    'USER_TYPE_ID' => MoneyType::USER_TYPE_ID,
    'SETTINGS' => ['DEFAULT_CURRENCY' => 'USD'],
]);
if ($fieldId === 0) {
    $error = $APPLICATION->GetException();
    throw new SystemException($error ? $error->GetString() : 'Поле не создано');
}

$field = $USER_FIELD_MANAGER->GetUserFields($entityId)[$fieldName];

// 100|USD, если USD заведена на сайте; до 26.100.0 было бы 100|<базовая валюта>
echo MoneyType::onBeforeSave($field, '100');

    

Тот же вызов onBeforeSave() на уже существующем поле покажет, куда сейчас уходят ваши суммы.

CUserTypeEntity::Update() заменяет SETTINGS целиком результатом prepareSettings(), поэтому передавайте DEFAULT_VALUE в каждом вызове с SETTINGS, иначе значение по умолчанию пропадёт. Если оно не пустое, меняйте валюту в нём самом: ['DEFAULT_VALUE' => '100|EUR']. Отдельный DEFAULT_CURRENCY рядом с прежним 100|USD не сработает, метод перезапишет его на USD.

Обновите копии шаблонов поля

Компонент bitrix:currency.money.input получил параметр CURRENCY с валютой для значения, в котором её нет. Если параметр пуст или такой валюты нет в списке, компонент берёт базовую. Шаблоны main.edit, main.edit_form и main.admin_list_edit_html компонента currency.field.money теперь показывают у пустого значения валюту поля, а не первую или базовую. В админке при редактировании строки списка валюта значения, которой нет среди доступных, всё равно появится в селекторе.

Обёртка поля в main.edit и main.edit_form получила атрибут data-default-currency, из него JS BX.Main.UF.TypeMoney берёт валюту для новой строки множественного поля. Если вы скопировали эти шаблоны в шаблон сайта, новое поведение до копий не дойдёт, и форма продолжит предлагать прежнюю валюту. Сверьте с оригиналом из 26.100.0 и шаблон, и result_modifier.php, потому что значение для data-default-currency готовит он.

Мелочи и находки

  • Установщик модуля перевели с install.sql на install/migrations: таблицы описаны в tables.php, обработчики событий в events.php, а в корне модуля появился migration_config.json. Существующие таблицы b_catalog_currency* не меняются, ALTER в релизе нет. Если переводите на миграции свой модуль, currency подойдёт как компактный образец.
  • В шаблоне currency.money.input валюта попадает в JS-инициализацию через CUtil::JSEscape, раньше выводилась как есть. В своих копиях шаблона сделайте так же.
  • Бандл money-editor.bundle.js пересобран без транспиляции в ES5: там теперь нативный class со статическими полями, это синтаксис ES2022. Заодно редактор суммы перестал сбрасывать выделение текста, если форматирование не изменило значение.

Новая версия вышла — разбор уже в Telegram

В канале @bxmax_updates публикуем каждый свежий разбор: что сломается, что устарело и что появилось в API. Узнаете до того, как обновите прод.

Подписаться

Читайте дальше

landing 26.1600.0 Безопасность Свежее

Landing 26.1300.200–26.1600.0: закрыты дыры с PHP и правами групп, поля редактора стали ES-классами

С прошлого разбора вышли четыре версии landing: 26.1300.200, 26.1400.0, 26.1500.0 и 26.1600.0. В каждой закрыты дыры, от сборки PHP-тега при импорте сайта до лишних прав у участников групп соцсети. Попутно в режиме Битрикс24 превью черновика переехало на маршрут раздела «Сайты», а поля редактора ста…

7 мин
calendar 26.300.0 Безопасность Свежее

Calendar 26.300.0: закрыты дыры в правах на календари и переговорки, дельта в REST

Calendar 26.300.0 закрывает три дыры в правах: перенос события в чужой календарь без права на добавление, подмену чужой брони переговорки через `LOCATION[’OLD’]` или `room_event_id` и добавление в участники проектов, где пользователь не состоит. Для интеграций в `calendar.event.get` появилось инкрем…

2 мин
blog 26.600.0 Заметное Свежее

Blog 26.600.0: тег кеша для важных сообщений и исправленные права в уведомлениях

Blog 26.600.0 ничего не ломает и базу не трогает. Разработчику он даёт тег кеша `blogpost_important_all` и метод, который считает, сколько секунд осталось до ближайшей отложенной публикации важного сообщения. `bitrix:blog.blog` в папке модуля больше не перебирает все посты блога ради списка авторов,…

2 мин
anonymizer 26.100.100 Рутинное Свежее

Anonymizer 26.100.100: исправлена установка на PostgreSQL

В PostgreSQL слово `END` зарезервировано, поэтому `CREATE TABLE` для `b_anonymizer_replacements` с колонкой `END int NOT NULL` падал с синтаксической ошибкой. `InstallDB()` в этом случае возвращает `false` раньше `registerModule(’anonymizer’)`, и на PostgreSQL модуль не устанавливался. В 26.100.100…

1 мин
Мы используем файлы cookie для улучшения работы сайта. Продолжая использовать сайт, вы соглашаетесь с нашей политикой конфиденциальности.
AI Домовой

AI Домовой История

на связи

пишет…

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

Нет истории чатов
AI Домовой

Нужна авторизация

Войдите, чтобы задавать вопросы AI Домовому.

Войти