0

我有一个在 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”值,为什么我的表单会从下拉列表切换到文本框?

4

2 回答 2

2

如果您想通过文本字段使用实体,则应在字段中添加自定义模型数据转换器,将实体的“文本”表示转换为“真实”实体并将实体反向转换为他的“文本”表示.

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

于 2013-03-29T00:18:24.313 回答
1

我在symfony 官方文档中找不到关于这个主题的正式解释,但是 AFAIK 任何代表关系的表单字段都应该由Entity Field Type. 这是 symfony 的基本表单功能渲染和持久化代表实体的表单字段的唯一方式。

不过,您可以使用它Data Transformers来实现您想要的。

来自 symfony食谱

假设您具有任务与问题的一对一关系,例如,任务可选地具有与其相关联的问题。添加一个包含所有可能问题的列表框最终会导致一个非常长的列表框,在其中无法找到某些内容。您可能想要添加一个文本框,用户可以在其中简单地输入问题编号。

于 2013-03-29T00:10:09.990 回答