新增非EN/DE语言商店后,更新邮件模板类型触发翻译创建致异常
解决方案
问题根源
Shopware的仓储(Repository)执行update操作时,若当前上下文的语言无对应实体翻译记录,默认会自动尝试创建新的翻译条目——哪怕仅更新非翻译字段(如templateData),这就导致了name字段为空的约束报错。
可行解决方法
1. 使用回退语言上下文执行更新
切换到已有翻译的回退语言(如EN/DE)上下文执行更新,避免触发目标语言的翻译创建:
// 获取回退语言ID(示例:获取英文语言) $fallbackLanguage = $this->languageRepository->search( (new Criteria())->addFilter(new EqualsFilter('iso', 'en')), $context->getContext() )->first(); // 克隆上下文并替换为回退语言 $fallbackContext = $context->getContext()->clone(); $fallbackContext->setLanguageId($fallbackLanguage->getId()); // 执行更新 $this->mailTemplateTypeRepository->update([[ 'id' => $mailTemplateType->getId(), 'templateData' => $data ]], $fallbackContext);
2. 关闭自动创建翻译的行为
通过上下文扩展直接禁用自动创建翻译的逻辑:
// 克隆当前上下文 $updateContext = $context->getContext()->clone(); // 关闭自动创建翻译 $updateContext->getExtension('translation')->set('autoCreate', false); // 执行更新 $this->mailTemplateTypeRepository->update([[ 'id' => $mailTemplateType->getId(), 'templateData' => $data ]], $updateContext);
3. 直接操作实体对象(推荐)
加载实体对象后直接修改字段再保存,仓储的save方法会智能识别字段变更,不会无故触发翻译创建:
// 加载目标邮件模板类型实体 $mailTemplateType = $this->mailTemplateTypeRepository->search( new Criteria([$mailTemplateType->getId()]), $context->getContext() )->first(); // 修改非翻译字段 $mailTemplateType->setTemplateData($data); // 保存变更 $this->mailTemplateTypeRepository->save([$mailTemplateType], $context->getContext());
内容的提问来源于stack exchange,提问作者Ezycod
相关产品推荐
相关产品推荐

