fix(product): сохранение Data и extra fields в процессорах Create/Update#298
fix(product): сохранение Data и extra fields в процессорах Create/Update#298Ibochkarev wants to merge 3 commits into
Conversation
|
Спасибо за PR — закрывает реальный гэп в processor-флоу для msProductData и сделано архитектурно правильно (trait, whitelist, разделение Create/Update, alias-классы). Прошёлся по коду, PHPStan прогнал — есть три вещи, которые лучше доделать до мержа. Корректность диагнозаПодтверждаю: АрхитектураДелю на сильные стороны и проблемы. Хорошо
🔴 Блокер 1 — PHPStanПрогнал по файлам PR (
Решение: либо уточнить тип в 🔴 Блокер 2 — discarded return value в
|
MODX Resource processors call fromArray() without ignoreInvalid, so extra fields and flat msProductData keys were dropped. Add Data payload support and apply allowed fields in beforeSave() after loadMap(). Closes #297
Move product data payload application to afterSave on Create so price and extra fields save once the resource id exists; add MODX resolver aliases for Resource Create/Update and JSON-decoded Data payloads.
78f1724 to
0edef3c
Compare
- Annotate msProduct::getDataFieldsNames() as list<string> for PHPStan - Treat empty msProductData payload as noop success in trait - Log ERROR when Create fails to persist msProductData after resource insert - Log WARN when Data JSON payload is malformed
|
@biz87 можно смотреть повторно |
Описание
Исправляет #297: поля
msProductData(включая Object Extension / extra fields, напримерext_id) не сохранялись при вызовеrunProcessorс блокомDataили плоскими ключами (price, …).Причина (две части):
Resource\Create|Updateвызывают$object->fromArray($properties)безignoreInvalid— колонкиmsProductDataне попадают на объект.Dataтребуетidресурса; запись вbeforeSave()не гарантирует persistpriceи extra fields.Решение:
ProductDataPayloadTrait: захватDataвbeforeSet(), whitelist черезgetDataFieldsNames(),loadMap()для extra fields.applyProductDataPayload()вbeforeSave().persistProductDataPayload()вafterSave()после insert ресурса.msProductCreateProcessor/msProductUpdateProcessorдля резолвераResource\Create|Update::getInstance()(импорт CSV, интеграции).Поддерживаются плоские ключи в корне payload и явный блок
Data(при конфликте побеждаетData).Тип изменений
Связанные Issues
Closes #297
Как это было протестировано?
Конфигурация тестирования:
php -lдля изменённых PHP-файлов (OK)Сценарии для ревьюера:
MiniShop3\Processors\Product\Create+Data=>['price' => 5200, 'ext_id' => '…']— значения вms3_products.MODX\Revolution\Processors\Resource\Create+class_key = msProduct— тот же результат (alias-процессор).Updateс блокомData— поля обновляются.price/ext_idв корне payload.options-*).Пример
runProcessor:Скриншоты (если применимо)
price/ extra fields не сохранялись черезrunProcessorна CreateDataи плоские ключи послеafterSave()Чеклист
Дополнительные заметки
Code review (clean-code / pre-merge)
Сильные стороны:
capture/apply/persist).getDataFieldsNames()+array_intersect_key— безопаснее произвольного merge.fromArray(..., true, true)сignoreInvalid— корректный контракт для extra fields.afterSave+ explicitsave) / Update (beforeSave) задокументировано в docblock trait.Model\— минимальный diff, без дублирования логики.Замечания (не блокеры, follow-up):
persistProductDataPayload()возвращаетfalseи при «нет полей для записи», и при ошибке$productData->save()— вCreate::afterSave()результат не проверяется; при сбое save клиент может получить success. Имеет смысл различать noop / failure или проверять return при непустом payload.Dataиз connector молча игнорируется — для отладки можно log или validation error (низкий приоритет).Затронутые файлы:
Processors/Product/ProductDataPayloadTrait.php(новый)Processors/Product/Create.php,Update.phpModel/msProductCreateProcessor.php,msProductUpdateProcessor.php(новые)