使用表单事件时的Symfony表单字段顺序

问题描述:

我正在创建一个类似于所需的动态表单here使用表单事件时的Symfony表单字段顺序

嗯,我设法让它工作。但我希望类型的本地字段可以在动态下拉菜单之后出现。这不是在箱子外面,因为投寄箱都加入到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); 
     } 
    }); 

我试图做的名称相同字段中添加这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'));它将接受任何文本。

有没有更好的方式来做到这一点,所以我仍然可以使用数字浏览器验证?

这是2.0和2.1版本的Symfony Bug,与Form Events无关。

当在'数字'字段中输入字符串'9fgda'时,不存在验证错误,并且字符串值'9fgda'被转换为数字值'9'并且不会产生错误。

这是因为NumberFormatter,应该为版本2.2修复。

有关此错误的更多信息here