Skip to content

msOrder: в $order поля cost/cart_cost/delivery_cost — отформатированные строки, не числа (ломает |number в Fenom) #242

@Ibochkarev

Description

@Ibochkarev

Источник

Комментарий на 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_costformat->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).

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions