Symfony表单仅在数据库中插入一个字段

时间:2018-06-25 21:32:00

标签: symfony doctrine symfony-forms

我有3个实体:Languages,Countrys和SetupWizard,其中包含通过languageID和countryID属性与以前的实体建立的ManyToOne关系。 我也有一个SetupWizardType,所以我可以通过以下方式构建表单:

$builder
    ->add('language', EntityType::class, [
        'translation_domain' => 'labels',
        'label' => 'label.languages',
        'placeholder' => false,
        'class' => Languages::class,
    ])
    ->add('country', EntityType::class, [
        'translation_domain' => 'labels',
        'label' => 'label.countries',
        'placeholder' => false,
        'class' => Countries::class
    ]);

如您所见,最终表单将具有2个选择字段及其选项,并且当用户从“语言”选择框中选择一个选项时,将触发一个jquery事件,该事件将提交表单并将作业传递给我的控制器:

$entityManager = $this->getDoctrine()->getManager();
$setupWizard = $entityManager->getRepository(SetupWizard::class)->findSetup(1)
    ?? new SetupWizard();

$form = $this->createForm(SetupWizardType::class, $setupWizard);
$form->handleRequest($request);
$userLanguage = $form->get('language');

if ( $form->isSubmitted() ) {

    $submittedData = $form->getData();

    if( !empty($userLanguage->getData()) && empty($_POST['save']) ){

        $setupWizard->setLanguage($userLanguage->getData());
        $entityManager->persist($setupWizard);
        $entityManager->flush();
        return $this->redirectToRoute('wizard_index');

    } elseif( $form->isValid() && !empty($_POST['save']) ) {

        $entityManager->persist($submittedData);
        $entityManager->flush();
        return $this->redirectToRoute('app_homepage');
    }
}

这是做什么的?好吧,有两种情况,在第一种情况下,选择了语言选项,因此我将其保存在db中,在下一页加载时,订户将对其进行检查并更改语言环境,以便我可以使用在第二种情况下,它检查整个表单是否已完成并且有效,以便我可以将所有值插入db中。

为什么我要这样做?我不知道一种更好的诚实方式... ajax不在讨论之中,因为我需要以所选语言呈现数据,而且这只有通过服务器端编码才有可能...我想。为此,请告诉我。 我的代码有什么问题?在第一种情况下,我只想插入语言,而不是添加所有字段...这可能是因为我使用了EntityType字段,并且当我$entityManager->persist($setupWizard);时它保存了整个对象。只有语言价值吗?

P.S。如果您认为我的代码中的一部分可以重构为更好的代码,请告诉我,因为我是symfony / doctrine的新手,因此可以帮助我学习更多。

0 个答案:

没有答案