Ste*_*ant 5 ajax symfony-forms symfony
在我的应用程序中,我有几个表单字段有很多选项.我遇到的问题类似于这个问题:在每个页面加载时获取和解析所有选项都很昂贵(Twig一遍又一遍地渲染所有选项,而没有客户端缓存可能).这个问题让我创建了一种通过AJAX将选项发送到浏览器的方法.相当简单的方法:
为了防止Symfony查询所有选项(不必要:它们通过AJAX加载)我添加setMaxResults(0)到QueryBuilder表单加载时(通过控制器添加选项).是的,这是kludge.提交表单时,它仍将执行查询,因为它必须验证所选选项是否存在(并检查约束).
我想创建一个自定义表单字段类型,将此功能添加到当前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());
}
}
Run Code Online (Sandbox Code Playgroud)如何使用缓存内容填充表单字段:
这是你自己的逻辑,我建议:创建一个仅返回(作为 HTML)的控制器:
<option value="1">Option 1</option>
<option value="2">Option 2</option>
Run Code Online (Sandbox Code Playgroud)
在控制器中设置 Maxage :
/*
* @Route(...)
* @Cache(maxage=64000)
*/
public function getOptionsAction(Request $request) // Home
{
$choices = $this->getDoctrine()->getManager()->getRepository //....
return $this->render(/*...*/);
}
Run Code Online (Sandbox Code Playgroud)
使用 javascript 加载此 url 并将 html 结果放入您的选择字段中。
如果您使用的是 Select2 之类的东西:您的控制器还可以将选项作为 JSONReponse() 返回,那么您可以直接从 select2 ajax 选项加载此 JSON(请参阅捆绑文档,这就是我使用它的方式)。
在 Form::PRE_SUBMIT 事件中获取提交的选择(如果您使用表单进行编辑,则还可以获取 PRE_SET_DATA),并将这些选择重新注入到字段中。
| 归档时间: |
|
| 查看次数: |
663 次 |
| 最近记录: |