【问题标题】:How to bind Symfony2 form with an array (not a request)?如何将 Symfony2 表单与数组(不是请求)绑定?
【发布时间】:2013-04-16 18:48:42
【问题描述】:

假设我有一个包含一堆字段的 HTML 表单。一些字段属于产品,一些属于订单,一些属于其他。提交表单后,我想接受该请求,然后在控制器中为 Product、Order 和 Other 创建 Symfony 表单。然后我想获取部分表单数据并将其与适当的表单绑定。一个例子是这样的:

$productArray = array('name'=>$request->get('name'));
$pf = $this->createForm(new \MyBundle\Form\ProductType(), $product);
$pf->bind($productArray);
if($pf->isValid()) {
  // submit product data
}

// Do same for Order (but use order data)

// Do same for Other (but use other data)

问题是当我尝试这样做时,我无法让 $form->isValid() 方法工作。似乎 bind() 步骤失败了。我怀疑它可能与表单令牌有关,但我不确定如何修复它。同样,我在视图中构建了自己的 HTML 表单(我没有使用 form_widget(),因为它需要以某种方式将一堆 FormTypes 合并为一个复杂的东西)。我只是想要一种非常简单的方法来使用基本的 HTML 表单和 Symfony 表单功能集。

谁能告诉我这甚至可以用 Symfony 实现,我该怎么做?

【问题讨论】:

    标签: php symfony


    【解决方案1】:

    您需要禁用 CSRF 令牌才能手动绑定数据。

    为此,您可以在创建表单对象时传递csrf_protection 选项。

    像这样:

    $pf = $this->createForm(new \MyBundle\Form\ProductType(), $product, array(
        'csrf_protection' => false
    ));
    

    【讨论】:

      【解决方案2】:

      我觉得您可能需要一个嵌入其他表单的表单:

      // Main form
      $builder
          ->add('product', new ProductType)
          ->add('order', new OrderType);
      

      并拥有一个包含与您绑定到请求的其他对象的关联的对象。就像这样,您只需将一个对象与请求绑定并通过简单的 getter 访问嵌入的对象。

      我够清楚了吗?

      【讨论】:

        猜你喜欢
        • 2011-10-22
        • 1970-01-01
        • 2016-04-28
        • 2014-01-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多