Используя формы Symfony, есть ли способ сохранить несопоставленные значения полей в базе данных и извлечь их позже, чтобы перестроить форму? - PullRequest
0 голосов
/ 25 сентября 2019

Используя компонент формы Symfony, у меня есть форма «Настройки отчета» с 35 опциями и несколькими встроенными формами.Есть ли способ собрать выбранные параметры, сохранить их в базе данных, а затем позднее использовать эти постоянные параметры, чтобы перестроить форму, отражающую ранее выбранные параметры, без создания выделенного объекта для самой формы или длявстроенные формы?

Я знаю, что могу сериализовать массив и сохранить его в одном поле - это прекрасно, но я не могу понять, как извлечь это поле и повторно применить его к форме, чтобы пользователь могизменить настройки отчета.

Ответы [ 2 ]

1 голос
/ 25 сентября 2019

Вы можете добавить пустое поле для пользовательского объекта.Затем поместите свою сериализованную / десериализованную логику в метод получения / установки для поля.Таким образом, вы получите что-то , подобное этому:

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

$form->setData($user->getReportSettings());
0 голосов
/ 26 сентября 2019

Это то, что я наконец-то закончил.

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

...