Источник
Комментарий на modx.pro (Алексей Шумаев).
Проблема
В массиве $order, который формирует сниппет msOrder (ms3_order.php), значения cost, cart_cost, delivery_cost, discount_cost задаются через $ms3->format->price(...) без флага валюты — но Format::price() всё равно возвращает строку с разделителями групп разрядов (number_format), например с пробелом как разделителем тысяч для RU.
В итоге в шаблоне это не «чистое» число, а отформатированная строка. Это:
- ломает ожидания при арифметике/сравнениях;
- даёт фатал при модификаторе
|number в Fenom/pdoTools (некорректный паринг строки с пробелами).
Где в коде
core/components/minishop3/elements/snippets/ms3_order.php (после getCost()):
$order['cost'], cart_cost, delivery_cost, discount_cost ← format->price() → строка;
*_formatted ← та же строка плюс символ валюты при необходимости.
MiniShop3\Utils\Format::price() всегда прогоняет значение через formatNumber() / number_format().
Аналогичный паттерн есть в ms3_get_order.php для полей заказа: cost / cart_cost / … тоже через format->price().
Ожидаемое поведение (с точки зрения API сниппета)
Имена полей cost, cart_cost, delivery_cost выглядят как числовые суммы; для вывода в шаблоне уже предусмотрены *_formatted и currency_symbol в том же сниппете.
Логично:
- либо класть в
cost / cart_cost / … сырые float (как в ответе getCost()), а отображение оставлять на *_formatted или явное форматирование в чанке;
- либо добавить отдельные ключи (например
cost_raw, cart_cost_raw, …) с числами, не ломая текущие чанки, ожидающие локализованную строку без символа валюты в cart_cost.
Временный обход для шаблонов
Как в комментарии на modx.pro — нормализовать строку перед |number, либо оперировать полями, которые реально числовые (если появятся в сниппете).
Файлы для правки (кandidaty)
core/components/minishop3/elements/snippets/ms3_order.php
- при унификации контракта:
core/components/minishop3/elements/snippets/ms3_get_order.php
- при смене семантики базовых ключей — проверить дефолтный чанк
ms3_order.tpl (сейчас {$order.cart_cost} + отдельный currency_symbol).
Источник
Комментарий на modx.pro (Алексей Шумаев).
Проблема
В массиве
$order, который формирует сниппет msOrder (ms3_order.php), значенияcost,cart_cost,delivery_cost,discount_costзадаются через$ms3->format->price(...)без флага валюты — ноFormat::price()всё равно возвращает строку с разделителями групп разрядов (number_format), например с пробелом как разделителем тысяч для RU.В итоге в шаблоне это не «чистое» число, а отформатированная строка. Это:
|numberв Fenom/pdoTools (некорректный паринг строки с пробелами).Где в коде
core/components/minishop3/elements/snippets/ms3_order.php(послеgetCost()):$order['cost'],cart_cost,delivery_cost,discount_cost←format->price()→ строка;*_formatted← та же строка плюс символ валюты при необходимости.MiniShop3\Utils\Format::price()всегда прогоняет значение черезformatNumber()/number_format().Аналогичный паттерн есть в
ms3_get_order.phpдля полей заказа:cost/cart_cost/ … тоже черезformat->price().Ожидаемое поведение (с точки зрения API сниппета)
Имена полей
cost,cart_cost,delivery_costвыглядят как числовые суммы; для вывода в шаблоне уже предусмотрены*_formattedиcurrency_symbolв том же сниппете.Логично:
cost/cart_cost/ … сырые float (как в ответеgetCost()), а отображение оставлять на*_formattedили явное форматирование в чанке;cost_raw,cart_cost_raw, …) с числами, не ломая текущие чанки, ожидающие локализованную строку без символа валюты вcart_cost.Временный обход для шаблонов
Как в комментарии на modx.pro — нормализовать строку перед
|number, либо оперировать полями, которые реально числовые (если появятся в сниппете).Файлы для правки (кandidaty)
core/components/minishop3/elements/snippets/ms3_order.phpcore/components/minishop3/elements/snippets/ms3_get_order.phpms3_order.tpl(сейчас{$order.cart_cost}+ отдельныйcurrency_symbol).