我有一个我在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”值,为什么我的表单会从下拉到文本框中断?
答案 0 :(得分:2)
如果要通过文本字段使用实体,则应将自定义模型数据转换器添加到您的字段,该字段将实体的“文本”表示转换为“实际”实体&将实体反向转换为其“文本”表示。
这将避免您的模型由于setter typehint而导致PHP致命错误。
答案 1 :(得分:1)
我无法在symfony official documentation中找到关于此主题的正式解释,但AFAIK表示关系的任何表单字段都应由Entity Field Type
呈现。这是symfony的基本表单功能用于呈现和持久化表示实体的表单字段的唯一方式。
尽管如此,您可以使用Data Transformers
来达到您想要的效果。
:
假设你有一个一对一的Task to Issue关系,例如a任务可选地有一个链接到它的问题。添加包含所有可能问题的列表框最终会导致一个非常长的列表框,在该列表框中无法找到某些内容。您可能希望添加文本框,用户只需输入问题编号即可。