Описание проблемы
Во вкладке «Связи» карточки товара диалог «Связь товаров» при «Сохранить и закрыть» отвечает 400 и тостом «Неизвестная ошибка». В консоли:
[ProductLinksTab] saveLink RequestError: Неизвестная ошибка
at Ko.request (index-….min.js)
at async ie (product-tabs.min.js)
Кнопки «Сохранить» и «Сохранить и закрыть» зовут один saveLink() (ProductLinksTab.vue): POST /api/mgr/product-data/{id}/links с { link, slave }. Разница только в закрытии диалога после успеха.
Бэкенд: ProductDataController::createLink → ProductLinkService::create. Сообщение ms3_err_unknown («Неизвестная ошибка») отдаётся, когда applyLinkType() / addLink() вернул false (неизвестный тип связи или msProductLink::save() не прошёл). linkActionResponse мапит любой ok: false в HTTP 400 без errors.
Шаги воспроизведения
- Открыть товар в менеджере (пример: id 22).
- Вкладка «Связи» → создать связь.
- Выбрать тип связи и товар магазина.
- Нажать «Сохранить и закрыть».
Ожидаемое поведение
Связь сохраняется, диалог закрывается, грид обновляется. Если сохранить нельзя, API называет причину (ms3_err_ns, ms3_err_link_equal, ms3_err_no_link, дубликат, ошибка БД), не общий unknown.
Фактическое поведение
HTTP 400:
{
"success": false,
"message": "Неизвестная ошибка",
"object": {
"success": false,
"message": "Неизвестная ошибка",
"code": 400,
"errors": null
}
}
Тело запроса (без auth/cookies): POST /api/mgr/product-data/22/links с {"link":1,"slave":124}.
Скриншоты
Диалог «Связь товаров»: тип test, товар «Диван JBL Prime», стрелка на «Сохранить и закрыть». В консоли тот же RequestError.
Окружение
- MiniShop3: 1.12.0-beta1
- MODX: 3.x
- Браузер: Chrome 151 / macOS
Логи ошибок
Консоль браузера — см. стек выше.
core/cache/logs/error.log в момент сохранения связи. xPDO шлёт пустой INSERT: составной PK (link, master, slave) не попал в SQL (fromArray() без setPrimaryKeys эти поля пропускает):
[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
)
Повтор в 17:14:47 и 17:14:54, тот же SQL и HY000/1364.
Дополнительный контекст
Проверить: тип связи id=1 (one_to_one шлёт две строки master↔slave), уникальный индекс на (link, master, slave), парсинг JSON-body в connector. Пока addLink() глотает false в ms3_err_unknown, фронт не отличит валидацию от сбоя БД.
Описание проблемы
Во вкладке «Связи» карточки товара диалог «Связь товаров» при «Сохранить и закрыть» отвечает 400 и тостом «Неизвестная ошибка». В консоли:
Кнопки «Сохранить» и «Сохранить и закрыть» зовут один
saveLink()(ProductLinksTab.vue):POST /api/mgr/product-data/{id}/linksс{ link, slave }. Разница только в закрытии диалога после успеха.Бэкенд:
ProductDataController::createLink→ProductLinkService::create. Сообщениеms3_err_unknown(«Неизвестная ошибка») отдаётся, когдаapplyLinkType()/addLink()вернул false (неизвестный тип связи илиmsProductLink::save()не прошёл).linkActionResponseмапит любойok: falseв HTTP 400 безerrors.Шаги воспроизведения
Ожидаемое поведение
Связь сохраняется, диалог закрывается, грид обновляется. Если сохранить нельзя, API называет причину (
ms3_err_ns,ms3_err_link_equal,ms3_err_no_link, дубликат, ошибка БД), не общий unknown.Фактическое поведение
HTTP 400:
{ "success": false, "message": "Неизвестная ошибка", "object": { "success": false, "message": "Неизвестная ошибка", "code": 400, "errors": null } }Тело запроса (без auth/cookies):
POST /api/mgr/product-data/22/linksс{"link":1,"slave":124}.Скриншоты
Диалог «Связь товаров»: тип
test, товар «Диван JBL Prime», стрелка на «Сохранить и закрыть». В консоли тот жеRequestError.Окружение
Логи ошибок
Консоль браузера — см. стек выше.
core/cache/logs/error.logв момент сохранения связи. xPDO шлёт пустой INSERT: составной PK(link, master, slave)не попал в SQL (fromArray()безsetPrimaryKeysэти поля пропускает):Повтор в 17:14:47 и 17:14:54, тот же SQL и HY000/1364.
Дополнительный контекст
Проверить: тип связи id=1 (
one_to_oneшлёт две строки master↔slave), уникальный индекс на(link, master, slave), парсинг JSON-body в connector. ПокаaddLink()глотает false вms3_err_unknown, фронт не отличит валидацию от сбоя БД.