Symfony2表单自定义字段类型,包含多个字段

时间:2013-12-04 21:20:04

标签: php symfony symfony-forms

使用Symfony2表单苦苦挣扎。 User对象具有Location类的属性。表单需要在2个选择框中显示位置:国家/地区,城市。 (稍后城市选择框将通过ajax更新。)

尝试使用数据转换器和事件,但无法找到出路,只是更加困惑。 是否有任何提示要采取哪些措施来实现这一目标?

// User class
class User
{
     ...
     protected $location;
}    

// LOCATION class
class Location
{
        ...
        protected $city;
        protected $country;
}


// User TYPE
class UserType extends AbstractType
{
    ...
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        ...
        $builder->add("location", new LocationType);
    }
}

// CUSTOM Location FORM TYPE
class LocationType extends AbstractType
{
....
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->add("country", "choice");
        $builder->add("city", "choice");


    }
}

1 个答案:

答案 0 :(得分:3)

经过一天的阅读文档后,我发现了Bernhard Schussek的一段非常有用的视频。 http://www.youtube.com/watch?v=Q80b9XeLUEA

看了两次之后想出了如何做这个要求。

  • 模型数据的类型为Location
  • 规范化数据的类型为数组

  • 建立一个数据转换器,将Location对象转换为数组,其中的键对应于自定义字段类型(国家,城市)中的字段名称。

数据转换器已应用于整个自定义类型对象:

$builder->addModelTransformer(new LocationToArrayTransformer());
  • 国家/地区字段已在buildForm
  • 中添加并预先填充
  • 在PRE_SET_DATA上触发的事件侦听器中添加并预填充city字段。它还检查国家的价值,并根据预先填充的城市:

    $ builder->的addEventListener( \的Symfony \分量\表格\ FormEvents :: PRE_SET_DATA, function(FormEvent $ event) {

     $cities = array(); // prepopulate here using a service, etc.
    
     $event->getForm()->add("cityId", "choice", array("choices" => $cities));
    

    });

  • 使用jQuery添加了更新城市的功能,使用ajax动态选择。