2012-06-03 30 views
13

我正在为backbone.js应用程序开发一个symfony2后端。我有我的模型和形式。用额外的字段验证symfony2表格

但是,backbone.js在创建/更新模型时会向REST API发送一些其他属性,而我正努力使表单得到验证。

如何获取symfony2中的表单以接受其他数据,或者如何在将数据绑定到表单之前删除特定的键?

回答

12

要获得Symfony2的接受额外的数据,添加附加字段到你的表单生成器,并设置其property_path选项设置为false:

例子:

$builder 
    ->add('my_additional_field', 'checkbox', array(
     'mapped' => false, 
    )); 

你并不需要删除键在绑定数据之前,无论如何他们都会被忽略。

+3

+1> = 2.1的快速注释:“2.1版本中的新功能:自2.1版本以来,已为此用例添加了映射选项。” http://symfony.com/doc/2.1/reference/forms/types/hidden.html#mapped –

+0

也许你应该考虑更新你的答案,增加什么版本是有效的。 – xPheRe

+1

我不再做PHP了。如果可以,请更新我的答案。 –

2

您可以侦听FormEvents::BIND_CLIENT_DATA(或FormEvents::PRE_BIND,如果您使用2.1 dev)事件侦听器并添加/删除字段。参见this食谱条目。

16

property_path现在已经过时,在SF 2.1,使用 “映射”,而不是

$builder 
    ->add("firstName", "text") 
    ->add("lastName", "text") 
    ->add("tac", "checkbox", array(
     "mapped" => false 
    ) 
); 
46

您应该使用选项 “allow_extra_fields”。

public function setDefaultOptions(OptionsResolverInterface $resolver) 
{ 
     $resolver->setDefaults(
     array(
      'allow_extra_fields' => true 
     ) 
    ); 
} 
+2

allow_extra_fields在2.6之前不会被包含在symfony中。这将是添加额外字段的正确方法。如果您知道将要提交的额外字段名称,那么mapped = false将是建议的方式。 – Heyflynn

+1

由于2.6现在已被标记为稳定版本,因此应将其标记为正确答案。 @ user1432227 – Chausser

+0

@krun您还可以添加symfony 2.8/3. *示例,它是:'configureOptions(OptionsResolver $ resolver)'而不是setDefaultOptions函数。 –