【问题标题】:Save form data to session, repopulate form with it on refresh (Symfony)将表单数据保存到会话,刷新时用它重新填充表单(Symfony)
【发布时间】:2016-10-19 09:13:14
【问题描述】:

我愿意在提交到会话时保存一个表单(使用 FormBuilder 创建)。一旦用户回到同一页面,表单应该重新填充之前提交的信息,以防它存在。

    // Create form
    $form = $this->createForm(MappingType::class, $mapping);
    $form->handleRequest($request);

    // Populate it if we already have data from the request or from session, only when not submitted
    if (!$form->isSubmitted() && $request->getSession()->has('mapping')) {
       $form->setData($request->getSession()->get('mapping'));
    }

    // Save form data to session
    if ($form->isSubmitted() && $form->isValid()) {
        $request->getSession()->set('mapping', $form->getData());
    }

MappingType 表单包含子项,但顶层的字段似乎没有再次填充。 Children 主要由 ChoiceType 字段组成。

会话数据由所有表单数据填充。由于我没有使用 Doctrine,而只是一个普通实体,因此我认为持久性没有问题。

表单会在 POST 请求 (handleRequest) 上正确填充,但当我再次加载时 (GET) 不会。

有什么想法吗?

【问题讨论】:

  • 如果你移动在handleRequest之前设置数据的块会发生什么?
  • 不幸的是没有改变任何东西,@Veve

标签: php symfony


【解决方案1】:

正如 Veve 所说,您必须在创建这样的表单之前设置数据:

if($request->getSession()->has('mapping'))) {
    $mapping->setSomething('value');
    $mapping->setSomethingOhter('value');
}
$form = $this->createForm(MappingType::class, $mapping);

编辑

如果对象存在于例如数据库中

$mapping = $em->getRepository('AppBundle:Object')->findBy('field'=>'value');
$form = $this->createForm(MappingType::class, $mapping);

【讨论】:

  • 好的,但是需要大量的手动工作。当我在我的初始帖子中尝试时,是否可以再次插入所有请求数据?我不让它工作。我不想遍历所有字段并一一设置,感觉效率低下。
  • 所以基本上我希望它将表单数据 ($form->getData()) 存储到会话中并稍后再次设置在表单上。这是一个相当复杂的表格,里面有几个孩子,所以我希望使用这种方法。根据用户上传的文件,表格每次也不同。
  • 捷径是采用 $request->getSession()->get('mapping') 并在 'createForm' 调用中使用它。我的问题是我有孩子表单字段,他们正在使用类的子实例,这使它无法正常工作。调整它使它起作用,所以我认为这是要求的答案,因为它让我一直在寻找正确的方法。
猜你喜欢
  • 1970-01-01
  • 2012-07-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-11
  • 1970-01-01
相关资源
最近更新 更多