#shopware
Вопрос:
Я пытаюсь создавать продукты с помощью модуля администратора, который пока работает хорошо, но я не могу передавать переводы на другие языки. Я следовал этому руководству: https://shopware.stoplight.io/docs/admin-api/docs/guides/writing-entities/associations.md#translated-fields
Это мой код:
createProduct() {
const getTaxId = () => {
const criteria = new Criteria();
this.taxRepository.create('tax');
return this.taxRepository.search(criteria, Shopware.Context.api);
};
getTaxId().then(result => {
const taxId = result[0].id;
const newProduct = this.productRepository.create(Shopware.Context.api);
const randomProductHash = Math.floor(Math.random() * 100000);
newProduct.name = 'Das TestProdukt ' randomProductHash;
newProduct.taxId = taxId;
// translation setted like in the guide
newProduct.translations = {
'2fbb5fe2e29a4d70aa5854ce7ce3e20b': {
name: 'Das TestProdukt ' randomProductHash,
description: 'english description by code',
},
'2d7d7d698f634a04b5796e49aa846ae6': {
name: 'The testProdckt ' randomProductHash,
description: 'german description by code',
},
};
newProduct.price = [
{
currencyId: 'b7d2554b0ce847cd82f3ac9bd1c0dfca',
extensions: [],
gross: (Math.random() * 500 500).toFixed(2),
linked: true,
listPrice: null,
net: (Math.random() * 250 250).toFixed(2),
},
{
currencyId: 'f772f2a317324871a9bb441c34ca0094',
extensions: [],
gross: (Math.random() * 500 500).toFixed(2),
linked: true,
listPrice: null,
net: (Math.random() * 250 250).toFixed(2),
},
];
newProduct.productNumber = 'DEMO_' Math.floor(Math.random() * 100000);
newProduct.stock = 1;
console.log(newProduct);
const context = Shopware.Context.api;
context.systemLanguageId = '2fbb5fe2e29a4d70aa5854ce7ce3e20b';
this.productRepository.save(newProduct, context).then(e => {
console.log(e);
});
});
Но когда я отправляю его, я получаю ошибку:
changeset-generator.data.js?13e4:177 - Uncaught (in promise) TypeError: draft.forEach is not a function
at ChangesetGenerator.handleOneToMany (changeset-generator.data.js?13e4:177)
at eval (changeset-generator.data.js?13e4:98)
at eval (entity-definition.data.js?1f64:119)
at Array.forEach (<anonymous>)
at EntityDefinition.forEachField (entity-definition.data.js?1f64:118)
at ChangesetGenerator.recursion (changeset-generator.data.js?13e4:53)
at ChangesetGenerator.generate (changeset-generator.data.js?13e4:34)
at Repository.save (repository.data.js?1d07:103)
at eval (index.js?cce3:158)
Похоже, что forEach пытается выполнить цикл через объект «переводы», что, конечно, невозможно как объект. Итак, какой должна быть структура объекта переводов?
Ответ №1:
Хорошо, я понял это, я не знаю, просто ли документация неверна, или я посмотрел не в том месте. Но вот как это работает:
Вместо настройки переменной NewProduct.translation вам нужно добавить в нее новый перевод.
let translation = this.translationRepository.create(Shopware.Context.api);
translation.languageId = '2fbb5fe2e29a4d70aa5854ce7ce3e20b';
translation.name = 'THE';
newProduct.translations.add(translation);
translation = this.translationRepository.create(Shopware.Context.api);
translation.languageId = '2d7d7d698f634a04b5796e49aa846ae6';
translation.name = 'DAS';
newProduct.translations.add(translation);
Кроме того, вы должны добавить это в вычисляемый метод:
translationRepository() {
return this.repositoryFactory.create('product_translation');
},