我正在创建一个类似于想要的动态表单here。
我设法让它运转起来。但我希望这种类型的原生字段可以在动态下拉列表后出现。这不是开箱即用的,因为dropbox被添加到PRE_SET_DATA事件中的表单中(在构建表单并添加名称字段之后),如您所见:
public function buildForm(FormBuilder $builder, array $options)
{
$builder->add('country', 'entity', array(
'class'=>'TestBundle:Country',
'property'=>'name',
'property_path'=>false //Country is not directly related to City
));
$builder->add('name');
$factory = $builder->getFormFactory();
(...)
$builder->addEventListener(FormEvents::PRE_SET_DATA, function (DataEvent $event) use ($refreshStates, $setCountry)
{
$form = $event->getForm();
$data = $event->getData();
if($data == null)
return;
if($data instanceof City){
$country = ($data->getId()) ? $data->getState()->getCountry() : null ;
$refreshStates($form, $country);
$setCountry($form, $country);
}
});
我尝试对name字段执行相同操作,将其添加到buildForm函数的开头:
$addBaseFields = function ($form) use ($factory)
{
$form->add($factory->createNamed('text', 'name'));
};
然后我在事件中添加了它:
$builder->addEventListener(FormEvents::PRE_SET_DATA, function (DataEvent $event) use ($refreshStates, $setCountry)
{
$form = $event->getForm();
$data = $event->getData();
if($data == null)
return;
if($data instanceof City){
$country = ($data->getId()) ? $data->getState()->getCountry() : null ;
$refreshStates($form, $country);
$setCountry($form, $country);
$addBaseFields($form);
}
});
这种作品。但是,html5字段验证停止工作。例如:如果我将名称定义为“数字”类型而不是“文字”:$form->add($factory->createNamed('number', 'name'));
它将接受任何内容,任何文字。
有没有更好的方法可以使用数字浏览器验证呢?
答案 0 :(得分:2)
这是版本2.0和2.1上的Symfony Bug,与表单事件无关。
当在'number'字段中输入'9fgda'这样的字符串时,没有验证错误,字符串值'9fgda'在数字值'9'中转换,并且没有错误。
这是因为NumberFormatter,应该修复版本2.2。
有关此错误的更多信息here