>通过AJAX获取所有选项(键值)(例如通过获取/countries.json)并尽可能缓存. (在这种情况下,国家名称不太可能经常变化)
>使用selectize,select2或类似的插件将选项插入DOM.
>享受更快的表格:-)
为了防止Symfony查询所有选项(不必要:它们通过AJAX加载)我在加载表单时将setMaxResults(0)添加到QueryBuilder(通过控制器添加选项).是的,这是kludge.提交表单时,它仍将执行查询,因为它必须验证所选选项是否存在(并检查约束).
我想创建一个将此功能添加到当前EntityType的custom Form Field Type:在呈现表单时不加载选项,但仍检查所选选项是否存在.我发现many examples与dynamically modifying a form有关,但我没有找到与修改一个表单字段相关的示例,与其父表单无关.
如何创建这样的表单字段类型?什么是一个很好的起点?扩展EntityType,ChoiceType还是其他方法?
我已经在使用Symfony 3.1了,所以使用lazy loading of form choices(Symfony 3.2中的新功能)不会有问题.不确定这个新功能是否与我的问题有关.
解决方法
> How to avoid loading each entities by each form rendering:
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加载此网址并将html结果放入您的选择字段.
如果你使用像Select2这样的东西:
您的Controller也可以将选项作为JSONReponse()返回,然后您可以直接从select2 ajax选项加载此JSON(请参阅包文档,这就是我使用它的方式).
>而最困难的是:How to make the submitted choice valid:
获取Form :: PRE_SUBMIT事件中的总和选项(如果使用表单进行编辑,也可以使用PRE_SET_DATA),并将这些选项重新输入到字段中.