在我的应用程序中,我有几个带有许多选项的表单字段。我遇到的问题类似于此问题:在每次页面加载时获取和解析所有选项的成本很高(Twig一次又一次地渲染所有选项,而无法进行客户端缓存)。这个问题使我创造了一种通过AJAX将选项发送到浏览器的方法。相当简单的方法:
为了防止Symfony查询所有选项(不必要:它们是通过AJAX加载的),我在加载表单时(通过控制器添加选项)添加setMaxResults(0)
到QueryBuilder
。是的,那太过分了。提交表单时,它仍将执行查询,因为它必须验证所选选项是否存在(并检查约束)。
我想创建一个自定义的“表单字段类型”,将该功能添加到当前表单中EntityType
:渲染表单时不要加载选项,但仍要检查所选选项是否存在。我发现了许多
与动态修改表单有关的示例,但我还没有发现与仅修改一个表单域(独立于其父表单)有关的示例。
如何创建这样的表单字段类型?一个好的起点是什么?扩展EntityType
,ChoiceType
还是其他方法?
我已经在使用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