使用Symfony表单,是否有办法将未映射的字段值持久保存到数据库中,并在以后检索它们以重建表单?

问题描述 投票:0回答:2

使用Symfony的表单组件,我有一个“报告设置”表单,其中包含大约35个选项和一些嵌入式表单。有没有一种方法可以收集选定的选项,将其持久保存到数据库中,然后在以后使用这些持久的选项来重建反映先前选定选项的表单,而无需为表单本身或表单创建专用实体。嵌入式表格?

我知道我可以序列化数组并将其存储在单个字段中,这很完美,但是我无法弄清楚如何检索该字段并将其重新应用于表单,以便用户可以更改其报表设置。

symfony doctrine symfony-forms
2个回答
1
投票

您可以向用户实体添加可为空的字段。然后将您的序列化/反序列化逻辑放入该字段的getter / setter中。因此,您最终会使用something来使用它:

$user->setReportSettings($form->getData());

$form->setData($user->getReportSettings());

0
投票

这是我最终得到的结果。

当我添加需要设置的新报表时,将创建一个新的未映射表单并将其嵌入MasterReportSettingsType中。这将处理新的/现有的设置并检索现有的设置以进行修改。

仅在父表单上使用getData(),甚至迭代嵌入的表单并使用getData()都会返回表单元数据的字段[[和,这是不希望的。有了这个,我只能得到该字段及其值,并且Doctrine可以处理序列化/反序列化。

public function reportSettingsAction( Request $request ) { $account = $this->getUser()->getAccount(); $form = $this->createForm(MasterReportSettingsType::class); $rs = $this->rsRepository->getReportSettingsForAccount($account); if (null !== $rs) { // Apply existing report settings to form foreach ($rs->getSettings() as $formKey => $fields) { foreach ($fields as $fieldKey => $fieldValue) { if (($form->has($formKey)) && ($form->get($formKey)->has($fieldKey))) { $form->get($formKey) ->get($fieldKey) ->setData($fieldValue) ; } } } } $form->handleRequest($request); if ($form->isSubmitted() && $form->isValid()) { // Retrieve the embedded forms, their fields, and the field values foreach ($form->all() as $key => $subform) { foreach ($subform->all() as $fieldKey => $fieldValue) { $settings[$key][$fieldKey] = $fieldValue->getData(); } } if (null === $rs) { // If there were no existing report settings $rs = new ReportSettings(); } $rs->setAccount($account); $rs->setSettings($settings); $this->em->persist($rs); $this->em->flush(); $this->addFlash('success', 'Settings saved'); return $this->redirectToRoute('report-settings'); } return $this->render('report/report_settings.html.twig', $form->createView()); }
© www.soinside.com 2019 - 2024. All rights reserved.