【问题标题】:Symfony2 Form custom field type with more than 1 fieldSymfony2 表单自定义字段类型超过 1 个字段
【发布时间】:2013-12-04 21:20:04
【问题描述】:

在 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");


    }
}

【问题讨论】:

  • 对不起,错误在哪里?因为这么多的代码,我看不出有什么问题。
  • 没有错误。我需要一些提示以使其发挥作用。
  • symfony.com/doc/current/cookbook/form/form_collections.html 这是关于你在做什么的文档,嵌入表单?不是吗?
  • Location 实体生成国家和城市choice 字段,这表明应该有一个可用选项列表(即城市和国家实体)。将它们作为文本框不是更有意义吗?或者你打算限制位置?位置应按照@Jahnux73 的建议处理。

标签: php symfony symfony-forms


【解决方案1】:

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

看了两遍才知道怎么做。

  • 模型数据属于位置类型
  • 归一化数据是数组类型

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

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

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

    $builder->addEventListener( \Symfony\Component\Form\FormEvents::PRE_SET_DATA, 功能(FormEvent $事件) {

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

    });

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-27
    • 1970-01-01
    • 2012-12-11
    相关资源
    最近更新 更多