包含多个步骤的{symfony表单

时间:2016-02-24 21:38:34

标签: forms symfony

我正在尝试创建一个包含多个步骤的表单: 显示的第一个字段应为电话号码类型 一旦提交,我想执行查找以查看是否有用户使用该电话号码。

如果找到了用户,那么我需要第二个字段进行验证,因此我创建了一个邮政编码字段。

我目前正在使用一个控制器和一个表单类型执行此操作:

检索类别:

public function buildForm(FormBuilderInterface $builder, array $options)
{

    $builder->add('phoneNumber', PhoneNumberType::class, array(
            'default_region' => 'US',
            'format' => PhoneNumberFormat::NATIONAL))
        ->add("finished", HiddenType::class, array(
            "data" => "no"))
        ->add("submit", SubmitType::class);

    $formModifier = function (FormInterface $form) {
            $phoneNumber = $form->get('phoneNumber')->getData();
            $one = $this->em->getRepository('AppBundle:Phone')->findOneByPhoneNumber($phoneNumber);
            if($one){
                $form->remove("submit"); 
                $form->remove("finished");                
                $form->add("zipCode", TextType::class);
                $form->add("finished", HiddenType::class, array(
                    "data" => "yes"));               
                $form->add("submit", SubmitType::class);
            }
        };

    $builder->addEventListener(
        FormEvents::PRE_SET_DATA,
        function (FormEvent $event) use ($formModifier) {
            $formModifier($event->getForm());
        }
    );
    $builder->get('phoneNumber')->addEventListener(
        FormEvents::POST_SUBMIT,
        function (FormEvent $event) use ($formModifier) {
            $formModifier($event->getForm()->getParent());
        }
    );
}

控制器:

    $form = $this->createForm(SearchType::class);

    $form->handleRequest($request);        
    if ($form->isSubmitted() && $form->isValid() && $form->get("finished")->getData() == "Yes") {
    //...
}

所以,我甚至不确定自己是否走在正确的轨道上。我目前正在尝试使用隐藏字段“完成”让控制器知道何时实际使用提交的数据进行工作,但“完成”永远不会设置为“是”,我不知道为什么。

除此之外,我还有更好的方法吗?

我查看了CraueFormFlowBundle但是这需要底层数据是一个对象(不适用于Array)而我不认为我想要它在这种情况下,因为我只是使用数据输入以执行查询。

0 个答案:

没有答案