Symfony2表单错误 - 为什么?

时间:2013-03-28 20:14:22

标签: symfony doctrine twig

我有一个我在symfony2中构建的表单。

$builder->add('purchaseOrder','text');
$builder->add('product', 'entity', array(
        'class' => 'WICProductBundle:Product',
        'property' => 'name',
        'query_builder' => function(EntityRepository $er) {
            return $er->createQueryBuilder('p')
                ->where('p.account=?1')
                ->orderBy('p.name', 'ASC')
                ->setParameter(1,$this->account);
        }
   ));

当我在Twig中输出此表单并提交时,它工作正常!

当我将表单生成器更改为此并提交表单时,出现错误?!?!

$builder->add('purchaseOrder','text');
$builder->add('product','text');

表单的第一次迭代我用8填写采购订单字段,然后在产品下拉列表中选择一个值为65的选项...一切正常...

表单的第二次迭代我用8填写采购订单字段,我填写产品字段,值为65 ......我收到此错误:

Catchable Fatal Error: Argument 1 passed to WIC\PurchaseOrderLineItemBundle\Entity\PurchaseOrderLineItem::setProduct() must be an instance of WIC\ProductBundle\Entity\Product, string given, called in /Applications/MAMP/htdocs/symfonydev/vendor/symfony/symfony/src/Symfony/Component/Form/Util/PropertyPath.php on line 538 and defined in /Applications/MAMP/htdocs/symfonydev/src/WIC/PurchaseOrderLineItemBundle/Entity/PurchaseOrderLineItem.php line 302

如果每次传递相同的“65”值,为什么我的表单会从下拉到文本框中断?

2 个答案:

答案 0 :(得分:2)

如果要通过文本字段使用实体,则应将自定义模型数据转换器添加到您的字段,该字段将实体的“文本”表示转换为“实际”实体&将实体反向转换为其“文本”表示。

这将避免您的模型由于setter typehint而导致PHP致命错误。

答案 1 :(得分:1)

我无法在symfony official documentation中找到关于此主题的正式解释,但AFAIK表示关系的任何表单字段都应由Entity Field Type呈现。这是symfony的基本表单功能用于呈现和持久化表示实体的表单字段的唯一方式。

尽管如此,您可以使用Data Transformers来达到您想要的效果。

来自symfony cookbook

  

假设你有一个一对一的Task to Issue关系,例如a任务可选地有一个链接到它的问题。添加包含所有可能问题的列表框最终会导致一个非常长的列表框,在该列表框中无法找到某些内容。您可能希望添加文本框,用户只需输入问题编号即可。