2011-08-12 8 views
4

私のフォームには、SceneとそのBackgroundの2つのオブジェクトがあります。ページの大部分は新しいSceneのフォームであり、サムネイルとファイル入力フィールドがあるコーナーがあります。ファイルフィールドが変更されると、画像はサーバーにアップロードされ、Backgroundエンティティが作成され、保持されます。次に、エンティティのIdを返します。エンティティはフォームの非表示フィールドに格納されます。Symfony2フォームエンベデッドエンティティの問題

これを提出すると、Scene#setBackgroundメソッドで文字列を格納しようとしていることがわかります。 SceneTypeフォームクラスのbackgroundフィールドからhidden属性を削除すると、<select>ボックスがレンダリングされ、すべて正常です。 hidden属性を追加し、同じデータを投稿すると、上記のエラーが発生します。

SceneType:

class SceneType extends AbstractType { 
    public function getName() { 
     return 'scene'; 
    } 

    public function buildForm (FormBuilder $builder, array $options) { 
     $builder->add('name'); 
     $builder->add('description'); 
     $builder->add('panoramic', null, array('required' => false)); 
     $builder->add('revealable', null, array('required' => false)); 
     $builder->add('left', 'hidden'); 
     $builder->add('right', 'hidden'); 
     $builder->add('background', 'hidden'); 
    } 
} 

Relevant section of Entity\Scene:

class Scene { 
    /** 
    * @ORM\OneToOne(
    *  targetEntity="Company\ProductBundle\Entity\Scene\Background", 
    *  inversedBy="scene" 
    *) 
    * @ORM\JoinColumn(
    *  name="scene_background_id", 
    *  referencedColumnName="id", 
    *  nullable=false, 
    *  onDelete="cascade", 
    *  onUpdate="cascade" 
    *) 
    */ 
    protected $background; 
    public function getBackground() { 
     return $this->background; 
    } 
    public function setBackground (Background $background) { 
     $this->background = $background; 
    } 
} 

Error message:

Catchable Fatal Error: Argument 1 passed to 
Company\ProductBundle\Entity\Scene::setBackground() must be an instance of 
Company\Company\Entity\Scene\Background, string given, called in 
/srv/http/symulator/vendor/symfony/src/Symfony/Component/Form/Util/PropertyPath.php 
on line 346 and defined in 
/srv/http/symulator/src/Noinc/SimulatorBundle/Entity/Scene.php line 143 

答えて

2

私は自分のフォーム、シーンとその背景には2つのオブジェクトを持っています。ページの大部分の は新しいシーンのためのフォームであり、サムネイルとファイル入力フィールドがある コーナーがあります。 ファイルフィールドが変更されるたびに、 バックグラウンドエンティティが作成されて保存されているサーバーにイメージがアップロードされます。その後、その背景には が関連付けられます。今、バックグラウンドが設定されているので、私は しかフォーム経由でシーンのプロパティを変更する心配がありません。

フォームに隠れたIDを渡す必要はありません。フォームの外部にその関連付けを保持することができます。このアプローチを検討したいと考えています。

あなたの方法を使用する必要がある場合、あなたはSceneTypeこのタグのフォームにそのフォームを追加し、BackgroundTypeフォームを作成する必要があります:

$builder->add('background', new BackgroundType()); 

私は(BackgroundTypeを想定)を隠しidフィールドをレンダリングします。

関連する問題