【问题标题】:Symfony 4 - ChoiceType field null when form submittedSymfony 4 - 提交表单时ChoiceType字段为空
【发布时间】:2019-12-10 16:45:18
【问题描述】:

我正在尝试将关联数组作为我的 OrdreMissionType 表单中的 ChoiceType 字段的选项传递:

$typeJour = ['Travaillée(s)' => "T", 'Calendaire(s)' => "C"];
$form = $this->createForm(OrdreMissionType::class, $odm,[
        'user' => $user,
        'affairesOdm' => $affairesForm,
        'typeJour' => $typeJour,
        'method' => 'PUT'
    ]);

$form->handleRequest($request);

if($form->isSubmitted() && $form->isValid()) {
        $odm = $form->getData();
        dd($odm);

        $em = $this->getDoctrine()->getManager();
        $em->persist($odm);
        $em->flush();
 }

我的 FormType 类:

class OrdreMissionType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
         //...
         $typeJour = $options['typeJour'];
         $builder->add('typeJour', ChoiceType::class, [
            'label' => 'Type de(s) journée(s)',
            'placeholder' => 'Sélectionnez une option',
            'choices' => $typeJour,
            'label_attr' => ['class' => 'radio-inline'],
         ]);
        //...
    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults([
            'typeJour' => false,
            'data_class' => OrdreMission::class
        ]);
    }
}

我的实体:

class OrdreMission
{
    //...
    /**
    * @ORM\Column(type="string", length=255)
    */
    private $typeJour;
    //...
}

我的问题是,当我提交表单时,'typeForm' 字段始终为空,这是 'dd' 行的输出:

我不想将选择放在我数据库的特定表中,因为它们永远不会改变。有人知道如何解决这个问题吗?任何帮助将不胜感激。提前谢谢你!

【问题讨论】:

    标签: php forms symfony doctrine


    【解决方案1】:

    您需要将 optinon 'empty_data' 添加到表单的字段属性中。

        public function buildForm(FormBuilderInterface $builder, array $options)
    {
         //...
         $typeJour = $options['typeJour'];
         $builder->add('typeJour', ChoiceType::class, [
            'empty_data' => 'T', //OR C
            'label' => 'Type de(s) journée(s)',
            'placeholder' => 'Sélectionnez une option',
            'choices' => $typeJour,
            'label_attr' => ['class' => 'radio-inline'],
         ]);
        //...
    }
    

    仅供参考:方法 configureOptions() 不适用于配置特定字段,它是表单配置。此外,您不能从范围(在您的情况下为 T 或 C)分配默认值

    【讨论】:

    • 我通过添加“'empty_data' => 'T'”测试了您的解决方案,但现在我的字段值始终为“T”。当我选择另一个选项时,我期望“C”值,但该值为“T”。我试图输入一个不在我的“typeJour”数组中的其他值,比如“B”,并且表单向我抛出了一个验证错误,这是正常的。表单似乎无法将字段的值分配给我的对象,但会检测到何时为字段分配了意外的值
    • 重新检查该字段的设置器。如果您的 setter 什么都不做,则可能会出现这种行为。
    • 我检查了我的二传手,但我不认为我的问题来自这里。我通过添加选项'expanded => true'找到了解决方法。无论如何,感谢您的帮助!
    【解决方案2】:

    我找到了解决此问题的方法,我添加了选项“expanded => true”,并且我的字段现在采用所选值。 我没有相同的图形渲染,但至少它可以工作!

    $builder->add('typeJour', ChoiceType::class, [
            'label' => 'Type de(s) journée(s)',
            'placeholder' => 'Sélectionnez une option',
            'expanded' => true,
            'choices' => ['Travaillée(s)' => "T", 'Calendaire(s)' => "C"]
        ]);
    

    【讨论】:

    • 这使它们成为收音机,如果你想要收音机,这很好,否则不太好
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-10-30
    • 1970-01-01
    • 2018-08-02
    • 2019-04-21
    • 2014-07-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多