Skip to content

fix(api): preserve null in Manager API payload field updates (#289)#295

Open
Ibochkarev wants to merge 1 commit into
betafrom
fix/289-null-payload-fields
Open

fix(api): preserve null in Manager API payload field updates (#289)#295
Ibochkarev wants to merge 1 commit into
betafrom
fix/289-null-payload-fields

Conversation

@Ibochkarev
Copy link
Copy Markdown
Member

Описание

В Manager API при whitelisted-пробросе полей из payload использовался isset($data[$field]), который возвращает false для значения null. PrimeVue InputNumber при очистке поля отправляет null, поэтому старое значение оставалось в БД (аналогичный баг уже исправлен в DeliveriesController / PaymentsController — PR #287).

Заменено на array_key_exists($field, $data) в подтверждённых местах и двух связанных сервисах с тем же антипаттерном. Неподтверждённые контроллеры из списка issue (#289) намеренно не тронуты, чтобы не плодить шум в diff.

Изменённые файлы:

  • OrdersController — создание черновика (адрес) и обновление позиции заказа (price, weight, очистка options через null)
  • ExtraFieldsService — обновление метаданных extra fields из Manager API
  • CustomerAddressManager — пересчёт hash при явной очистке адресных полей (null в payload)

Тип изменений

  • Исправление бага (non-breaking change)
  • Новая функциональность (non-breaking change)
  • Breaking change (изменение, ломающее обратную совместимость)
  • Рефакторинг (без изменения функциональности)
  • Документация
  • Другое (опишите):

Связанные Issues

Closes #289

Как это было протестировано?

  • Ручное тестирование (не выполнялось в CI-окружении; сценарий воспроизведения описан ниже)
  • Автоматические тесты (PHPStan, ESLint)
  • Тестирование на разных версиях PHP/MODX

Конфигурация тестирования:

  • MiniShop3: текущая ветка fix/289-null-payload-fields
  • MODX: —
  • PHP: php -l на изменённых PHP-файлах

Рекомендуемый сценарий ручной проверки:

  1. Открыть заказ в Vue-менеджере, отредактировать позицию.
  2. Очистить price или weight в InputNumber и сохранить — значение должно сброситься (xPDO приведёт null0 для decimal).
  3. Очистить опции позиции — options должны обнулиться (getOptionsForSave() шлёт null).

Скриншоты (если применимо)

До После

Чеклист

  • Код соответствует стилю проекта
  • Добавлены/обновлены комментарии в сложных местах
  • Изменения не ломают существующую функциональность
  • Лексиконы добавлены на двух языках (ru/en) — не требуется
  • PHPStan проходит без новых ошибок — не запускался локально
  • ESLint проходит без ошибок (для JS/Vue изменений) — Vue не менялся
  • Обновлён CHANGELOG.md (для значимых изменений) — по политике репо добавляется maintainer при релизе

Дополнительные заметки

Связанное исправление: PR #287 (DeliveriesController / PaymentsController).

Кандидаты из issue с низкой/средней вероятностью (CustomerAddressesController, VendorsController, CustomersController, LinksController, StatusesController) сознательно исключены — в соответствующих Vue-формах преобладают InputText / Checkbox, которые шлют '' или true/false, а не null.

Replace isset with array_key_exists so cleared PrimeVue InputNumber fields
and explicit null values reach xPDO set() instead of leaving stale DB data.
@Ibochkarev Ibochkarev requested a review from biz87 May 22, 2026 08:05
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

1 participant