Symfony 3:如何在Form中实现包含大量对象的EntityType?

时间:2017-10-25 14:24:16

标签: php symfony formbuilder

我有一个实体City,其中存储了超过30000个对象。用户可以将Address对象与ManyToOne关联添加到City。 但在表单构建期间,<input>类型无线电或select的呈现不适合对象的数量......

我使用以下实现代码(它是一个代码段):

public function buildForm(FormBuilderInterface $builder, array $options)
{
  /* Pattern to get cities */
  $pattern = 'Bor%';  //I use this filter to reduce the number of objects but not sufficient

  $builder
    ->add('city', EntityType::class, array(
      'class'        => 'AppPlatformBundle:City',
      'choice_label' => 'name',
      'multiple'     => false,
      'expanded'     => true,
      'query_builder'=> function(CityRepository $repository) use($pattern) {
        return $repository->getCitiesWithPattern($pattern);
      }));
}

我认为解决方案是使用TextType,用户在开始输入任何内容时可以选择提案。但我不知道如何实现这一点。

请问我的问题有解决方案吗?

谢谢

2 个答案:

答案 0 :(得分:1)

完成以下步骤:

  1. 创建继承自简单TextType
  2. 的自定义表单类型
  3. 将此自定义表单类型与javascript自动完成插件和ajax调用一起使用
  4. 创建自定义操作,以便检索您的选择框(由插件创建)的选择
  5. 在自定义表单类型中使用数据转换器,以便检索对象而不是值

答案 1 :(得分:1)

非常感谢Fabien。

我能够为我实施一个好的解决方案:)

因此,对于对我的解决方案感兴趣的任何人:

我将城市字段定义为HiddenField,如:

  $builder
    ->add('city', HiddenType::class);

我使用Data TransformerCity对象转换为唯一ID(对象的字段ID)

在Twig模板中,我实现了jQuery-ui Autocomplete

在后端,我创建了一个能够返回Json响应的路由,所有城市都通过term jQuery插件进行过滤。

在前端,我开发了一个jquery脚本,用于追加类型为Text的新字段“city”和自动完成操作。

收到回复后,我填写city字段Hidden,其中包含ID。