我正在尝试创建一个包含多个步骤的表单: 显示的第一个字段应为电话号码类型 一旦提交,我想执行查找以查看是否有用户使用该电话号码。
如果找到了用户,那么我需要第二个字段进行验证,因此我创建了一个邮政编码字段。
我目前正在使用一个控制器和一个表单类型执行此操作:
检索类别:
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)而我不认为我想要它在这种情况下,因为我只是使用数据输入以执行查询。