fix(product): сохранение Data и extra fields в процессорах Create/Update#298
Open
Ibochkarev wants to merge 2 commits into
Open
fix(product): сохранение Data и extra fields в процессорах Create/Update#298Ibochkarev wants to merge 2 commits into
Ibochkarev wants to merge 2 commits into
Conversation
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.
12 tasks
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Описание
Исправляет #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(новые)