I’m developing a custom product extension for Shopware 6 that includes a translatable field (“headline”). I’ve followed the recommended steps to set up my entity definitions and migrations, but I’m encountering a 400 Bad Request error when trying to save the product with translations.
My JS Component
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);
});
}
}
});
Entity Definitions
<?php declare(strict_types=1);
namespace WucPluginStartingAidExtensionContentProduct;
use ShopwareCoreContentProductProductDefinition;
use ShopwareCoreFrameworkDataAbstractionLayerEntityDefinition;
use ShopwareCoreFrameworkDataAbstractionLayerFieldFkField;
use ShopwareCoreFrameworkDataAbstractionLayerFieldFlagApiAware;
use ShopwareCoreFrameworkDataAbstractionLayerFieldFlagPrimaryKey;
use ShopwareCoreFrameworkDataAbstractionLayerFieldFlagRequired;
use ShopwareCoreFrameworkDataAbstractionLayerFieldIdField;
use ShopwareCoreFrameworkDataAbstractionLayerFieldOneToOneAssociationField;
use ShopwareCoreFrameworkDataAbstractionLayerFieldTranslatedField;
use ShopwareCoreFrameworkDataAbstractionLayerFieldTranslationsAssociationField;
use ShopwareCoreFrameworkDataAbstractionLayerFieldCollection;
use WucPluginStartingAidCoreContentStartingAidAggregateStartingAidTranslationStartingAidTranslationDefinition;
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 WucPluginStartingAidCoreContentStartingAidAggregateStartingAidTranslation;
use ShopwareCoreFrameworkDataAbstractionLayerEntityTranslationDefinition;
use ShopwareCoreFrameworkDataAbstractionLayerFieldFlagRequired;
use ShopwareCoreFrameworkDataAbstractionLayerFieldStringField;
use ShopwareCoreFrameworkDataAbstractionLayerFieldCollection;
use WucPluginStartingAidExtensionContentProductStartingAidExtensionDefinition;
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()),
]);
}
}
Error Message
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 ...
}
]
}
Are there any specific nuances in Shopware 6’s translation saving mechanism that I might be missing?
Could there be an issue with the order in which the extension and translation data are being saved?
Thanks in advance,
Niklas
- Verified entity relationships: The relationship between my main extension entity and its translation entity seems correct
- Cleared Shopware cache.
- build admin.js etc.
nibra180 is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.