使用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");
}
}
答案 0 :(得分:3)
经过一天的阅读文档后,我发现了Bernhard Schussek的一段非常有用的视频。 http://www.youtube.com/watch?v=Q80b9XeLUEA
看了两次之后想出了如何做这个要求。
规范化数据的类型为数组
建立一个数据转换器,将Location对象转换为数组,其中的键对应于自定义字段类型(国家,城市)中的字段名称。
数据转换器已应用于整个自定义类型对象:
$builder->addModelTransformer(new LocationToArrayTransformer());
在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动态选择。