0

先週からこの奇妙な問題を解決しようとしていますが、まだ解決策が見つからないため、ここで質問することにしました。

理解を深めるために、モデルの概要を説明します。

Ruta というエンティティがあり、画像のコレクションがあります。Ruta のすべての画像は ImagenRuta と呼ばれ、ImagenRuta を所有するエンティティ Ruta など、いくつかの属性があります。(OneToManyRelationship)

ここで私のエンティティ Ruta を見ることができます: https://gist.github.com/b0ae0daaebe4b6323d0

そして、私のエンティティ ImagenRuta はこちら: https://gist.github.com/9064fb2b5f4138423471

私の問題は、Ruta が持つ ImagenRuta のコレクション内のアイテムに関する情報を失うことなく Controller から Ruta を更新できないことです。特に、ImagenRuta の属性「imagen」は null に設定されています。その他の属性 (ImagenRuta の ID や Ruta の ID など) は失われません。

問題は、ImagenRuta のフォームの「imagen」のタイプ ファイルに関連している可能性があると思います。そのフィールドをテキストとして設定すると、エンティティ ImagenRuta の属性「imagen」が、更新したい Ruta が持つコレクションのどの ImagenRuta でも失われないためです。

ここに私の ImagenRuta のフォームがあります: https://gist.github.com/0409c630b8c9b3b08068

と私のルタのフォーム: http://gist.github.com/74db6231a2b238995fff

そして、テキストフィールドの問題に気付くために私が書いたコードは次のとおりです。

class ImagenRutaType extends AbstractType {        
    public function buildForm(FormBuilderInterface $builder, array $options) {          
        $builder->add('imagen', 'text', array('required' => true));    
    }        
}

次の文を使用して、エンティティ Ruta の元の ImagenRuta コレクションを復元してから、フォームの情報を使用してそのエンティティを execute で変更します$form->bindRequest($request)

$anterior = $editForm->getData(); // get ruta entity in form    
$originalImages = $anterior->getImagenes(); // get ImagenRuta collection

次に、$originalImages を $editForm に含まれる ImagenRuta のコレクションとマージします

$entity = $em->getRepository('RutasBundle:Ruta')->find($id);    
$editForm = $this->createForm(new RutaType(), $entity);    
$editForm->bind($request);    
$imagenesNuevas = $entity->getImagenes()    
// Merge $imagenesNuevas with $originalImages to not to lose any image

問題は、Ruta が持っていた ImagenRuta の以前のコレクションを復元できないことです。

$originalImages  = $ anterior-> getImagenes()

はい、$originalImagesコレクションがありますが、そのコレクション内のすべての ImagenRuta の「imagen」フィールドが null に設定されており (他はそうではありません)、その理由はわかりません。上で述べたように、これは ImagenRuta のフォームのフィールド「imagen」が「ファイル」タイプであることに関連していると思いますヌルに。

詳細については、コントローラーの updateAction を参照してください: https://gist.github.com/46e6d0d2f9e188f44030

多くのチュートリアル、ブログ、フォーラム、および公式のクックブック ドキュメントを読みましたが、解決策が見つかりませんでした。誰かが私を助けてくれることを願っています。

よろしく。

4

1 に答える 1

0

問題は、エンティティの単一のプロパティを使用して、データベースに永続化される画像の値と、フォームにアップロードされるファイル オブジェクトの両方を保持していることです。2 つの異なるプロパティが必要です。1 つはデータベースに保存され、画像のファイル名またはパスを保持し、もう 1 つは保存されず、フォーム ファイル フィールドに使用されます。詳細については、この料理本のエントリを参照してください。

http://symfony.com/doc/current/cookbook/doctrine/file_uploads.html

于 2012-09-29T16:46:43.557 に答える