【发布时间】:2021-06-13 16:30:53
【问题描述】:
Symfony 5.2.5
精简代码
//Entities
class Article {
/**
* @ORM\Id
* @ORM\GeneratedValue
* @ORM\Column(type="integer")
*/
private $id;
/**
* @ORM\OneToMany(targetEntity=ArticleTranslation::class, mappedBy="article", cascade={"persist"}, orphanRemoval=true)
* @Assert\Valid
*/
private $translations;
}
class ArticleTranslation {
/**
* @ORM\Id
* @ORM\GeneratedValue
* @ORM\Column(type="integer")
*/
private $id;
/**
* @ORM\Column(type="string", length=255)
* @Assert\NotBlank
*/
private $title;
/**
* @ORM\Column(type="text")
* @Assert\NotBlank
*/
private $body;
/**
* @ORM\ManyToOne(targetEntity=Article::class, inversedBy="translations")
* @ORM\JoinColumn(nullable=false)
*/
private $article;
/**
* @ORM\Column(type="string", length=5)
* @Assert\NotBlank
*/
private $locale;
}
//FormTypes
class ArticleType extends AbstractType {
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add(/*other fields*/)
->add('translations', ArticleTranslationType::class, ['label' => false, 'data' => new ArticleTranslation(), 'mapped' => false])
->add('save', SubmitType::class, ['label' => 'Save']);
$builder->get('translations')->addEventListener(FormEvents::POST_SUBMIT, function (FormEvent $event) {
$entity = $event->getForm()->getParent()->getData();
$translation = $event->getData();
$translation->setLocale($this->localeService->getCurrentLocale()); //custom service returns e.g. "en"
$entity->addTranslation($translation);
});
}
}
class ArticleTranslationType extends AbstractType {
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('title', TextType::class)
->add('body', TextareaType::class);
}
}
我有两个名为 Article 和 ArticleTranslation 的实体具有 OneToMany 关系。创建Article 时,我想在其中添加ArticleTranslation(例如英语)- 这样至少提供了1 个翻译。文章本身只存储发布日期等通用数据,而翻译存储标题和内容(称为正文)。上面的代码工作正常,我唯一的问题是:
当title 或body 的验证失败时,错误消息显示在公式上方,而不是在相关字段旁边。每个其他字段旁边都有正确的错误消息。我正在使用默认的 bootstrap 4 表单主题。
如何将错误消息移至正确的字段? Symfony 分析器返回 data.translations[0].body 不应该为空(因为它是一个集合,它有一个索引) - 我想我需要以某种方式将它变成 data.translations.body 才能工作?
临时修复:在我的ArticleTranslationType 中添加验证并删除Assert\Valid 约束时,它可以工作。仍然对我提供的代码的另一种解决方案感兴趣 - 谢谢
【问题讨论】:
-
你有哪个版本的symfony?另外,如果你分享树枝部分会很有帮助
-
Symfony 5.2.5 - twig 只是一个通用的表单渲染
{{ form(form) }}。表单主题是默认的symfony github.com/symfony/symfony/blob/5.x/src/Symfony/Bridge/Twig/…
标签: forms symfony validation