You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

新增非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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 13:31:06