ajax - 创建 'Ajaxified' 表单字段类型

标签 ajax symfony symfony-forms

在我的应用程序中,我有几个带有许多选项的表单字段。我遇到的问题类似于this question :在每个页面加载时获取和解析所有选项的成本很高(Twig 一遍又一遍地呈现所有选项,而没有客户端缓存可能)。这个问题让我创建了一种通过 AJAX 将选项发送到浏览器的方法。相当简单的方法:

  • 通过 AJAX 获取所有选项(键值)(例如通过获取/countries.json)并尽可能缓存。 (在这种情况下,国家名称不太可能经常更改)
  • 使用 selectize、select2 或类似的插件将选项插入到 DOM 中。
  • 享受更快的表格:-)

  • 为了防止 Symfony 查询所有选项(不是必需的:它们是通过 AJAX 加载的),我添加了 setMaxResults(0)QueryBuilder加载表单时(通过 Controller 添加选项)。是的,那是杂七杂八的。提交表单时,它仍将执行查询,因为它必须验证所选选项是否存在(并检查约束)。

    我想创建一个 custom Form Field Type将此功能添加到当前 EntityType : 在渲染表单时不加载选项,但仍检查所选选项是否存在。我找到了 many examples相关 dynamically modifying a form ,但我还没有找到与仅修改一个表单字段相关的示例,而与它的父表单无关。

    如何创建这样的表单字段类型?什么是好的起点?扩展 EntityType , ChoiceType或其他方法?

    我已经在使用 Symfony 3.1,所以使用 lazy loading of form choices (Symfony 3.2 中的新功能)不会有问题。不确定这个新功能是否与我的问题有关。

    最佳答案

    使用 Ajax Controller 选项自动完成对我来说看起来不错,但这是另一个(也许更快?)选项:通过 hinclude 呈现您的表单。

    hinclude是一个 JS 库,用于“延迟”页面部分的加载,Ajax 认为。 Symfony 带有集成支持 ( official documentation )。

    你如何使用它:

  • 将您的表单渲染移动到另一个 Controller 操作,我们称之为 formAction
  • 在您的页面上包含 hinclude.js(参见官方 Github)
  • 使用此代码呈现您的表单:

    {{ render_hinclude(controller('...::form'), {'default': 'Loading...'}) }}
  • 您可能希望在原始 Controller 操作中保留表单处理,因此修改生成的表单的“操作”,如下所示:

    $form = $this->createForm(new FormType(), $obj, array('action' => $this->generateUrl('original_form_action')));
  • 关于ajax - 创建 'Ajaxified' 表单字段类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38576990/

    相关文章:

    symfony - 根据 FormType 中的另一个选项值定义表单选项允许的值

    c# - 处理长时间运行的报告

    java - Wicket + jsTree,ajax 响应中的链接生成

    javascript - 如何在javascript中每10秒调用一次函数?

    Symfony2 嵌入表单 : error not displayed

    php - Symfony 2 - 使用子实体创建表单并上传文件

    javascript - Facebook 页脚栏是一个 iframe,那么为什么它不与页面的其余部分一起重新加载呢?

    symfony - Sensiolabs 洞察力 : Twig templates should not contain business logic

    PHP fatal error : momory size exhausted when using composer to install user-bundle

    php - 为每条收到的消息添加回复表单文本字段