Symfony2.1使用方法GET的形式

mog*_*man 7 url symfony-forms symfony-2.1

我需要有关使用带有method = GET的Symfony2.1表单和干净的URL空间的帮助.

我正在创建一个"过滤器",我想在URL中设置,以便人们可以为他们的链接添加书签.

所以,非常简单的代码:

$form = $this->createFormBuilder($defaultData)
    ->add('from', 'date', array('required' => false, 'widget' => 'single_text', 'format' => 'dd.MM.yyyy'))
Run Code Online (Sandbox Code Playgroud)

我渲染表单小部件,一切都很好.

但是,当我提交表单时,它会产生非常丑陋的GET参数:

/app_dev.php/de/event?form%5Bfrom%5D=17.11.2012
Run Code Online (Sandbox Code Playgroud)

这是因为输入名称当然是 form[from]

所以为了清理URL空间,我自己做了一个主题:

{% block widget_attributes %}
{% spaceless %}
    id="{{ id }}" name="{{ id }}"{% if read_only %} disabled="disabled"{% endif %}{% if required %} required="required"{% endif %}{% if max_length %} maxlength="{{ max_length }}"{% endif %}{% if pattern %} pattern="{{ pattern }}"{% endif %}
    {% for attrname,attrvalue in attr %}{{attrname}}="{{attrvalue}}" {% endfor %}
{% endspaceless %}
{% endblock widget_attributes %}
Run Code Online (Sandbox Code Playgroud)

在那里我换成name="{{ full_name }}"name="{{ id }}".

这很好 - 我的URL空间更清晰:

/app_dev.php/de/event?form_from=17.11.2012
Run Code Online (Sandbox Code Playgroud)

我想我可以忍受 - 虽然理想情况from=xxx会更好.这是第一个也是一个小问题.


第二个问题是我不能再让表单绑定了 - 这很明显因为参数"form"不再设置 - "form_from"已经替换它,但是当你执行绑定时它仍然期望form [] .

我试着解决这个问题:

$fromDate = $this->get('request')->query->get('form_from', null);
$request->query->set('form', array('from' => $fromDate);
Run Code Online (Sandbox Code Playgroud)

但这不起作用.我还怀疑我现在正在挖掘一大堆黑客.

所以,问题是:我应该只使用form%5Bfrom%5D网址,还是有更好的方法来完成所有这些(显然不使用POST)?

Ber*_*sek 26

您可以将根表单的名称设置为空,然后您的字段名称将是正确的form.通过这样做

// the first argument to createNamedBuilder() is the name
$form = $this->get('form.factory')->createNamedBuilder(null, 'form', $defaultData)
    ->add('from', 'date', array(
        'required' => false,
        'widget' => 'single_text',
        'format' => 'dd.MM.yyyy'
    ));
Run Code Online (Sandbox Code Playgroud)

  • `$ builder-> getFormFactory()`...谁知道?谢谢! (2认同)

Dev*_*key 7

老线程,但值得一提的是symfony 3 getName完全忽略了.

但是,getBlockPrefix如果您需要将表单名称设置为空白,则可以执行相同操作.

public function getBlockPrefix() {
    return null;
}
Run Code Online (Sandbox Code Playgroud)

这将导致表单字段被命名而没有前缀.