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 のオプションを選択します... すべてうまくいきます...

フォームの 2 回目の反復では、発注書フィールドに 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

テキスト フィールドを介してエンティティを使用する場合は、カスタム モデル データ トランスフォーマーをフィールドに追加して、エンティティの「テキスト」表現を「実際の」エンティティに変換し、エンティティを「テキスト」表現に逆変換する必要があります。 .

これにより、セッターの typehint が原因でモデルが PHP の致命的なエラーになることを回避できます。

于 2013-03-29T00:18:24.313 に答える
1

symfony の公式ドキュメントでこの主題に関する正式な説明を見つけることができませんでしたが、AFAIK では、関係を表すフォーム フィールドは でレンダリングする必要がありますEntity Field Type。これは、symfony の基本的なフォーム機能が、エンティティを表すフォームのフィールドをレンダリングおよび永続化する唯一の方法です。

それでも、あなたがData Transformers望むものを正確に達成するために使用することができます。

symfonyクックブックから:

タスクと課題の 1 対 1 の関係があるとします。たとえば、タスクにはオプションで課題がリンクされています。考えられるすべての問題を含むリストボックスを追加すると、最終的にリストボックスが非常に長くなり、何かを見つけることができなくなる可能性があります。代わりに、ユーザーが問題番号を入力するだけのテキスト ボックスを追加することもできます。

于 2013-03-29T00:10:09.990 に答える