【问题标题】:Symfony2.1 using form with method GETSymfony2.1 使用带有方法 GET 的表单
【发布时间】:2012-11-14 17:30:50
【问题描述】:

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

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

所以,代码非常简单:

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

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

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

/app_dev.php/de/event?form%5Bfrom%5D=17.11.2012

这是因为输入的名字当然是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 %}

我将name="{{ full_name }}" 替换为name="{{ id }}"

这很好用——我的 URL 空间更干净了:

/app_dev.php/de/event?form_from=17.11.2012

我想我可以忍受 - 尽管理想情况下 from=xxx 会更好。这是第一个也是更小的问题。


第二个问题是我无法再绑定表单了——这很明显,因为不再设置参数“form”——“form_from”已经替换了它,但是当你进行绑定时它仍然期待表单[]。

我尝试这样解决:

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

但这不起作用。我也怀疑我现在正在挖掘一个巨大的黑客漏洞。

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

【问题讨论】:

    标签: url symfony-forms symfony-2.1


    【解决方案1】:

    您可以将根表单的名称设置为空,那么您的字段名称将只是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'
        ));
    

    【讨论】:

    • 在使用 FormTypes 作为服务时是否可以这样做?我认为您无法在该上下文中访问 c​​reateNamedBuilder 并使用 FormType::getName() { return ''; } 导致将 FormType 引用为服务的问题。
    • 当然你可以访问createNamedBuilder(),你只需要访问表单工厂:)
    • $builder->getFormFactory()...谁知道?谢谢!
    • FormFactory -> createNamed 可用于获取Form 实例而不是构建器
    • @caponica 您在使用表单即服务时找到解决方案了吗?我被困住了!
    【解决方案2】:

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

    但是,如果您需要将表单名称留空,您可以对 getBlockPrefix 执行相同操作。

    public function getBlockPrefix() {
        return null;
    }
    

    这将导致表单字段被命名为不带前缀。

    【讨论】:

      【解决方案3】:

      在你的AbstractType::getName 的实现中使用return null; 这些天似乎有同样的效果。

      【讨论】:

      • 但是如果formtype返回null,则无法通过依赖注入生成formType
      • 通常不能将此方法与 DI 一起使用。返回 null 等同于接受的答案,请自行查看。
      猜你喜欢
      • 2018-09-29
      • 2014-01-29
      • 2022-11-19
      • 1970-01-01
      • 1970-01-01
      • 2011-02-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多