微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

创建’Ajaxified’表单字段类型

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

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

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

我想创建一个将此功能添加到当前EntityType的custom Form Field Type:在呈现表单时不加载选项,但仍检查所选选项是否存在.我发现many examplesdynamically modifying a form有关,但我没有找到与修改一个表单字段相关的示例,与其父表单无关.

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

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

解决方法

我写了一个捆绑包( Alsatian/FormBundle),它可以在服务器端执行您想要的操作.

> 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),并将这些选项重新输入到字段中.

原文地址:https://www.jb51.cc/html/231488.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐