使用Symfony的表单组件,我有一个“报告设置”表单,其中包含大约35个选项和一些嵌入式表单。有没有一种方法可以收集选定的选项,将其持久保存到数据库中,然后在以后使用这些持久的选项来重建反映先前选定选项的表单,而无需为表单本身或表单创建专用实体。嵌入式表格?
我知道我可以序列化数组并将其存储在单个字段中,这很完美,但是我无法弄清楚如何检索该字段并将其重新应用于表单,以便用户可以更改其报表设置。
您可以向用户实体添加可为空的字段。然后将您的序列化/反序列化逻辑放入该字段的getter / setter中。因此,您最终会使用something来使用它:
$user->setReportSettings($form->getData());
$form->setData($user->getReportSettings());
这是我最终得到的结果。
当我添加需要设置的新报表时,将创建一个新的未映射表单并将其嵌入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());
}