3

我正在创建一个类似于这里想要的动态表单。

好吧,我设法让它工作。但我希望该类型的本机字段可以出现在动态下拉列表之后。这不是开箱即用的,因为在 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')); 它将接受任何内容,任何文本。

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

4

1 回答 1

2

这是 2.0 和 2.1 版本的 Symfony 错误,与表单事件无关。

当在“数字”字段中输入诸如“9fgda”之类的字符串时,不会出现验证错误,并且字符串值“9fgda”会转换为数值“9”并且不会出错。

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

有关此错误的更多信息在这里

于 2012-10-24T14:56:08.827 回答