Currency 26.100.0: у поля «Деньги» появилась своя валюта по умолчанию
В 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. Заодно редактор суммы перестал сбрасывать выделение текста, если форматирование не изменило значение.