首页 > 解决方案 > Symfony Forms: Collection - 只需添加新条目/防止修改旧条目

问题描述

我在我的项目中遇到了问题,我真的不知道如何解决它。也许我的方法是完全错误的,我应该去另一个方向。


我有两个实体:文章和文章评论

在我的 ArticleType 中,我添加了带有 CollectionType 的 Comments(这样做的主要原因是我还想修改文章 - 基本上更改文章内容并且还能够添加 1 条评论):

//ArticleType.php
$builder->add('articleComments', CollectionType::class, ['label' => false, 'entry_type' => AritcleCommentType::class, 'entry_options' => ['label' => false]]);

我的 ArticleCommentType 只是一个 textarea 字段:

//ArticleCommentType.php
$builder->add('text', TextareaType::class, ['label' => 'comment', 'required' => false, 'attr' => ['class' => 'textarea-sm']]);

这个解决方案非常适合我。

但是,每当我添加评论时,我的其他评论也会呈现在 textarea 字段中并且可以编辑,这是我不想要的。我只是希望用户添加 1 条评论,重新加载页面并可能添加另一条评论就是这样。

我已经尝试阻止呈现其他评论,但这会引发错误,因为该元素不再位于 DOM 中 - 但仍然是预期的。

任何想法如何解决这一问题?(隐藏字段对我来说不是有效的解决方案)


更新:

我的控制器:

//ArticleController.php

...

/**
 * @Route("/article/{id}", name="app_article", requirements={"id"="\d+"})
 */
public function article(Request $request, Article $article)
{
    $articleComment = new ArticleComment();
    $article->addArticleComment($articleComment);

    $form = $this->createForm(ArticleType::class, $article);
    $form->handleRequest($request);

            if ($form->isSubmitted() && $form->isValid()) {
            $em = $this->getDoctrine()->getManager();
            $em->persist($articleComment); //cascade not active
            $em->persist($article);
            $em->flush();
            $this->addFlash('success', 'entry_saved');
            return $this->redirectToRoute('app_article', ['id' => $article->getId()]);
        }
        return $this->render('article/view.html.twig', ['article' => $article, 'form' => $form->createView()]);
}

...

更改文章类型:

$builder->add('articleComments', ArticleCommentType::class, ['label' => false, 'data' => new ArticleComment()]); //changed as suggested

标签: phpformssymfonycollectionsentity

解决方案


只要你用

$builder
  ->add('articleComments', CollectionType::class, [
    'label' => false, 
    'entry_type' => AritcleCommentType::class, 
    'entry_options' => ['label' => false],
    'mapped' => false,
  ]);

您将渲染整个集合。

对我来说,最合适的解决方案是直接添加ArticleCommentType属性datasette to new ArticleComment

如果你想显示所有的评论,你应该直接在模板中传递所有现有的ArticleComment显示你需要显示的内容。

您唯一应该注意的是手动添加(可能在表单订阅者中)全新元素(如果有任何价值)到现有集合。


推荐阅读