Это то, что я наконец-то закончил.
Когда я добавляю новый отчет, который нуждается в настройках, я создаю новую несопоставленную форму и внедряю ее в 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());
}