Shopware 6自定义产品扩展翻译保存失败:400错误求助
Shopware 6自定义产品扩展翻译字段保存400错误排查
我正在开发一款包含可翻译字段headline的Shopware 6自定义产品扩展,已按照官方推荐步骤配置实体定义与迁移,但保存带翻译的产品时遭遇400 Bad Request错误。
我的JS组件
const {Component} = Shopware; const {Criteria} = Shopware.Data; const Context = Shopware.Context; import template from "./sw-product-extension-detail-specifications.html.twig"; Component.override('sw-product-detail-specifications', { template, inject: ['repositoryFactory'], data() { return { productId: null, startingAidData: null }; }, created() { this.productId = this.$route.params.id; this.loadExtension(); }, computed: { wucPluginStartingAidExtensionCriteria() { const criteria = new Criteria(); criteria.addFilter(Criteria.equals('productId', this.productId)); return criteria; }, wucPluginStartingAidExtensionRepository() { return this.repositoryFactory.create('wuc_plugin_starting_aid_extension'); } }, methods: { loadExtension() { this.wucPluginStartingAidExtensionRepository .search(this.wucPluginStartingAidExtensionCriteria, Context.api) .then(startingAidData => { if (startingAidData.last()) { console.log('Data found', startingAidData.last()); this.product.extensions.wucPluginStartingAidExtension = startingAidData.last(); } else { console.log('Create and Set New Entity'); this.startingAidData = this.wucPluginStartingAidExtensionRepository.create(Shopware.Context.api); this.startingAidData.productId = this.productId; this.startingAidData.headline = 'Test!' this.product.extensions.wucPluginStartingAidExtension = this.startingAidData; console.log(this.product.extensions.wucPluginStartingAidExtension); } }) .catch(error => { console.error('Error loading extension:', error); }); } } });
实体定义
<?php declare(strict_types=1); namespace WucPluginStartingAid\Extension\Content\Product; use Shopware\Core\Content\Product\ProductDefinition; use Shopware\Core\Framework\DataAbstractionLayer\EntityDefinition; use Shopware\Core\Framework\DataAbstractionLayer\Field\FkField; use Shopware\Core\Framework\DataAbstractionLayer\Field\Flag\ApiAware; use Shopware\Core\Framework\DataAbstractionLayer\Field\Flag\PrimaryKey; use Shopware\Core\Framework\DataAbstractionLayer\Field\Flag\Required; use Shopware\Core\Framework\DataAbstractionLayer\Field\IdField; use Shopware\Core\Framework\DataAbstractionLayer\Field\OneToOneAssociationField; use Shopware\Core\Framework\DataAbstractionLayer\Field\TranslatedField; use Shopware\Core\Framework\DataAbstractionLayer\Field\TranslationsAssociationField; use Shopware\Core\Framework\DataAbstractionLayer\FieldCollection; use WucPluginStartingAid\Core\Content\StartingAid\Aggregate\StartingAidTranslation\StartingAidTranslationDefinition; class StartingAidExtensionDefinition extends EntityDefinition { public const ENTITY_NAME = 'wuc_plugin_starting_aid_extension'; public function getEntityName(): string { return self::ENTITY_NAME; } public function getEntityClass(): string { return StartingAidExtensionEntity::class; } protected function defineFields(): FieldCollection { return new FieldCollection([ (new IdField('id', 'Id'))->addFlags(new Required(), new PrimaryKey(), new ApiAware()), (new FkField('product_id', 'productId', ProductDefinition::class))->addFlags(new ApiAware()), (new TranslatedField('headline'))->addFlags(new ApiAware(), new Required()), new OneToOneAssociationField('product', 'product_id', 'id', ProductDefinition::class, false), (new TranslationsAssociationField( StartingAidTranslationDefinition::class, 'wuc_plugin_starting_aid_id' ))->addFlags(new ApiAware(), new Required()) ]); } }
<?php declare(strict_types=1); namespace WucPluginStartingAid\Core\Content\StartingAid\Aggregate\StartingAidTranslation; use Shopware\Core\Framework\DataAbstractionLayer\EntityTranslationDefinition; use Shopware\Core\Framework\DataAbstractionLayer\Field\Flag\Required; use Shopware\Core\Framework\DataAbstractionLayer\Field\StringField; use Shopware\Core\Framework\DataAbstractionLayer\FieldCollection; use WucPluginStartingAid\Extension\Content\Product\StartingAidExtensionDefinition; class StartingAidTranslationDefinition extends EntityTranslationDefinition { public const ENTITY_NAME = 'wuc_plugin_starting_aid_translation'; public function getEntityName(): string { return self::ENTITY_NAME; } public function getEntityClass(): string { return StartingAidTranslationEntity::class; } public function getParentDefinitionClass(): string { return StartingAidExtensionDefinition::class; } protected function defineFields(): FieldCollection { return new FieldCollection([ (new StringField('headline', 'headline'))->addFlags(new Required()), ]); } }
错误信息
POST http://localhost:8888/api/_action/sync 400 (Bad Request) { "errors": [ { "code": "c1051bb4-d103-4f74-8988-acbcafc7fdc3", "status": "400", "detail": "This value should not be blank.", "source": { "pointer": "/write/0/wucPluginStartingAidExtension/translations/2fbb5fe2e29a4d70aa5854ce7ce3e20b/wucPluginStartingAidExtensionId" }, // ... rest of the error message ... } ] }
已完成的排查步骤
- 验证实体关系:主扩展实体与翻译实体的关系无误
- 清除Shopware缓存
- 重新构建admin.js等资源
疑问
我是否忽略了Shopware 6翻译保存机制的特定细节?扩展与翻译数据的保存顺序是否存在问题?
内容的提问来源于stack exchange,提问作者nibra180
相关产品推荐
相关产品推荐

