当前位置: 首页 > 面试题库 >

创建一个“ Ajaxified”表单字段类型

苏麒
2023-03-14
问题内容

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

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

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

我想创建一个自定义的“表单字段类型”,将该功能添加到当前表单中EntityType:渲染表单时不要加载选项,但仍要检查所选选项是否存在。我发现了许多
与动态修改表单有关的示例,但我还没有发现与仅修改一个表单域(独立于其父表单)有关的示例。

如何创建这样的表单字段类型?一个好的起点是什么?扩展EntityTypeChoiceType还是其他方法?

我已经在使用Symfony 3.1,因此使用表格选项的延迟加载(Symfony
3.2中的新增功能)将不是问题。不知道此新功能是否与我的问题有关。


问题答案:

我写了一个包(Alsatian /
FormBundle
),它可以在服务器端实现您想要的功能。

  • 如何避免通过每个表单渲染加载每个实体:
        abstract class AbstractExtensibleChoicesType extends AbstractRoutableType
    {
        public function configureOptions(OptionsResolver $resolver)
        {  
            $resolver->setDefault('choices',array());
        }
    }
  • 如何使用缓存的内容填充表单字段:

我建议,这是您自己的逻辑:创建一个仅返回(作为HTML)的控制器:

<option value="1">Option 1</option>
<option value="2">Option 2</option>

在控制器中设置Maxage:

    /*
    * @Route(...)
    * @Cache(maxage=64000)
    */
    public function getOptionsAction(Request $request) // Home
    {
        $choices = $this->getDoctrine()->getManager()->getRepository //....

        return $this->render(/*...*/);
    }

使用javascript加载此URL,并将html结果放入您的选择字段。

如果您使用的是Select2之类的东西:您的控制器还可以将选项作为JSONReponse()返回,那么您可以直接从select2
ajax选项加载此JSON(请参阅包文档,这就是我的用法)。

  • 最困难的是:如何使提交的选择有效:

在Form :: PRE_SUBMIT事件中获取汇总的选择(如果使用表单进行编辑,则也请获取PRE_SET_DATA),然后将这些选择重新注入到字段中。



 类似资料:
  • 我需要在Cms后端表单(fields.yaml)中创建一个多选表单字段。我采用了以下方法 选择_字段: 此字段的选项将从模型中调用 一切正常,但当我提交表单时,只有第一个选择的选项作为JSON数据插入到数据库表文本字段中。我希望存储每个选定的选项。我也在模型中声明该字段为Jsonable,即受保护的$Jsonable=['field_name']; 注意:当我使用类型作为检查框列表时,它像我想的那

  • 问题内容: 我有2个表:projects,project_types。 如何基于project_type_id创建一个名为projectTypeName的虚拟字段,其名称来自projectType,对于那些project_type_id = 0的字段,它将为“” 我有这个 它正确显示为“ sales”,但我不想一一指定。 谢谢 问题答案: 这对我有用

  • 本文向大家介绍创建一个类Person的简单实例,包括了创建一个类Person的简单实例的使用技巧和注意事项,需要的朋友参考一下 创建一个类Person,包含以下属性:姓名(name)、年龄(age)、朋友(friends数组)、问候(sayhi方法,输出问候语,例如:“你好!”)、交朋友(addFriend方法,向friends里添加一个值),然后创建两个此类的实例:“小张“,22,[“小李”,”

  • 问题内容: 我正在阅读有关“ onChange”的文档, 并且对我的论坛有多个字段(例如选择框,复选框,文本区域和输入)会怎么办感到好奇?我是否要做类似的事情: 到初始状态,然后使用相同的概念来处理该字段的更改? 问题答案: 编辑:回想起来,这个答案很糟糕,请改用 Junle Li 的答案。 是的,您可以完全做到这一点。但是,当您获得许多表单组件时,编写所有处理程序和getInitialState

  • 问题: 怎样在模板中个别显示表单字段? 解决: 你可以使用’render()’方法在你的模板中显示部分的表单字段。 假设你想创建一个名字/姓氏表单。很简单,只有两个字段,不需要验证,只是为了测试目的。 from web import form simple_form = form.Form( form.Textbox('name', description='Name'), for