Skip to content

fix(product): persist composite PK when creating product links - #561

Open
Ibochkarev wants to merge 1 commit into
betafrom
fix/issue-558-product-link-create
Open

fix(product): persist composite PK when creating product links#561
Ibochkarev wants to merge 1 commit into
betafrom
fix/issue-558-product-link-create

Conversation

@Ibochkarev

@Ibochkarev Ibochkarev commented Aug 13, 2026

Copy link
Copy Markdown
Member

Описание

POST /api/mgr/product-data/{id}/links отвечал 400 «Неизвестная ошибка»: у msProductLink составной PK (link, master, slave), а fromArray() без setPrimaryKeys эти поля не пишет. save() возвращал false, create() прятал это в ms3_err_unknown.

В error.log xPDO подтверждает пустой INSERT:

[2026-08-13 17:13:13] (ERROR @ xPDO/Om/xPDOObject.php : 1447) Error HY000 executing statement:
INSERT INTO `modx_ms3_product_links` () VALUES ()
Array
(
    [0] => HY000
    [1] => 1364
    [2] => Field 'link' doesn't have a default value
)

Тот же HY000/1364 в 17:14:47 и 17:14:54.

Поля пишутся через set(), как в ProductLinksWriter. Неизвестный тип связи даёт ms3_err_no_link. Сбой save() или mesh many_to_many даёт ms3_err_link_save и запись в системный журнал. Кнопки «Сохранить» и «Сохранить и закрыть» ходят в один endpoint. Менять Vue не пришлось.

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

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

Связанные Issues

Closes #558

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

cd core/components/minishop3
php -l src/Services/Product/ProductLinkService.php
# exit 0
php tests/ProductLinkServiceTest.php
# OK ProductLinkServiceTest, exit 0
vendor/bin/phpunit tests/Unit/Services/Product/ProductLinkServiceCreateTest.php
# OK (7 tests, 13 assertions), exit 0
composer test:smoke
# OK smoke tests (70), exit 0

Vue не менялся, npm run lint:ci не запускался.

  • Ручное тестирование
  • Автоматические тесты (composer ci:php / composer test, npm run lint:ci, composer stan / GitHub Actions CI)
  • Тестирование на разных версиях PHP/MODX

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

  • MiniShop3: ветка beta (1.13.0-beta1)
  • MODX: стабы PHPUnit, без живого mgr
  • PHP: 8.4.17

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

Не приложено. Проверьте вкладку «Связи» у товара: «Сохранить и закрыть» должно закрыть диалог и обновить грид.

Чеклист

  • Код соответствует стилю проекта
  • Добавлены/обновлены комментарии в сложных местах
  • Изменения не ломают существующую функциональность
  • Лексиконы добавлены на двух языках (ru/en)
  • PHPStan проходит без новых ошибок (composer stan / CI job PHPStan)
  • ESLint проходит без ошибок (npm run lint:ci для Vue)
  • Обновлён CHANGELOG.md (для значимых изменений)

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

remove() по-прежнему отдаёт ms3_err_unknown при сбое DELETE. Это вне #558.

xPDO fromArray() skips PK fields on msProductLink, so save() failed and the API returned ms3_err_unknown. Write link/master/slave via set() and return ms3_err_link_save / ms3_err_no_link instead.
@Ibochkarev Ibochkarev added the bug Something isn't working label Aug 13, 2026
@Ibochkarev
Ibochkarev requested a review from biz87 August 13, 2026 17:41
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

bug Something isn't working

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Bug] 400 «Неизвестная ошибка» при сохранении связи товара

1 participant