php - 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
解决方案
只要你用
$builder
->add('articleComments', CollectionType::class, [
'label' => false,
'entry_type' => AritcleCommentType::class,
'entry_options' => ['label' => false],
'mapped' => false,
]);
您将渲染整个集合。
对我来说,最合适的解决方案是直接添加ArticleCommentType
属性data
sette to new ArticleComment
。
如果你想显示所有的评论,你应该直接在模板中传递所有现有的ArticleComment
显示你需要显示的内容。
您唯一应该注意的是手动添加(可能在表单订阅者中)全新元素(如果有任何价值)到现有集合。
推荐阅读
- javafx - 如何在基于 Gluon Mobile 的项目上设置图标?
- javascript - react如何在不同的组件库之间共享上下文?
- java - Alpha-3 语言代码到 alpha-2 的转换
- r - 如何计算 R 中逻辑模型中渐近线出现的时间?
- php - mysql 显示错误为 FUNCTION xxxxx.GETKeyList 不存在
- rust - 构建基板托盘出现以下故障,如何解决?
- grpc - GRPC 服务问题
- excel - 使用 CDatabase/ODBC 驱动程序获取 excel 文件表名称
- python - PyMongo pymongo.errors.ServerSelectionTimeoutError 使用 find_one()/insert() 但不使用 find()
- docker-compose - 将 Docker 多容器应用迁移到 Azure