如何将Symfony2表单与数组(不是请求)绑定?

时间:2013-04-16 18:48:43

标签: php symfony

假设我有一个包含大量字段的HTML表单。有些字段属于Product,有些属于Order,有些属于Other。提交表单时,我想接受该请求,然后在控制器中为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甚至可以做到这一点,我该怎么做呢?

2 个答案:

答案 0 :(得分:2)

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

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

像这样:

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

答案 1 :(得分:0)

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

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

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

我清楚了吗?