2011-12-18 6 views
2

コレクションを使用してフォームを作成しようとすると問題が発生します。私は現在のシナリオが何であるかを説明します。Symfony2 - DocumentChoiceListとMongoDB

製品カテゴリという2つの基本オブジェクトを作成しました。私はそれらのために2つのタイプを作成しました:ProductType、CategoryType

私は3つのカテゴリと1つの製品を持っています。私は製品の最初の2つのカテゴリを関連付けました。したがって、製品には2つのカテゴリが関連付けられています。

私は製品のフォームを作成したいと思います。このフォームでは、html selectコントロールに製品のカテゴリのみを表示したいので、ユーザーはこれらのデータで将来の操作を行うことができます。

私はあなたに要点をまとめます。

  1. マイ製品クラスは、私が持っている私のでProductType

    class Product 
    { 
        ... 
    
        @EmbedMany(targetDocument="Acme\StoreBundle\Document\Category") 
        protected $categories; 
    
        ... 
    
    } 
    
  2. があります

    public function buildForm(FormBuilder $builder, array $options) 
    { 
        $builder->add('id') 
         ->add('name') 
         ->add('price') 
         ->add('categories', 'document', array(
          'class' => 'Acme\StoreBundle\Document\Category', 
          'choices' => $builder->getData()->getCategories()->toArray(), 
          'multiple' => 'true', 
          'property' => 'name'      
         )) 
    ; 
    

    }

私はすべてを試したし、最も正確な半分ソリューション文書としてでProductTypeカテゴリプロパティを作成し、データがコントローラから来るバインドを通じてオプションを選択することでした。

点はオプションコントロールの、のUnitOfWorkクラス、ないIDS元カテゴリオブジェクトspl_object_hashセットされ、この溶液IDSです。

私の以前のtryings:

  1. 私は、以前の選択肢なしで文書を使用するとき、私は問題ありませんが、私は製品を所有しているカテゴリのみをしたいです。

  2. 私は(カテゴリタイプを関連付ける)カテゴリの一覧を表示するコレクションを使用するとき、私は問題ありませんが、私は選択制御としてこれを表示する方法がわかりません。

  3. 私はCategoryオブジェクトがどの製品の参照を持っていないので、オブジェクトのみが、製品ID Xを持って照会することはできませんので、私はquery_builder以上のカテゴリークラスを使用することはできません(とそのとおり)。

これを解決する方法はありますか?

ありがとう、 リッキー。

答えて

1

私は製品のフォームを作成したい

言います。このフォームでは、html selectコントロールに製品のカテゴリのみを表示したいので、ユーザーはこれらのデータで将来の操作を行うことができます。

しかし、次にすべてのカテゴリを取得します。

物事をシンプルにして、参照されるカテゴリを製品オブジェクトから奪ってみませんか?

$cats = $product->getCategories();  
if(!is_null($cats) && $cats->count() > 0) { 
    $choices = $cats; 
} else { 
// grab all so you can have the use set them 
    $choices = $builder->getData()->getCategories()->toArray() 
} 
+0

私の後の回答には申し訳ありません。ご説明をいただき、ありがとうございます。 – user957066

0

これは問題ではありません。問題は、MongoDBの埋め込みドキュメントで作業するときです。

これらの種類のドキュメントを扱う際には、Doctrine asume(正しいロジックを使用してください)では、この埋め込みドキュメントを他のコレクションに「手動で」参照することはありません。

はい、それは論理的ですが、他の拡張バージョンを他のコレクションで参照する簡略化された埋め込みドキュメントはありませんか?私の意見では、これは間違いです。

私の質問で説明したように、ODMはIDのアノテーションを持たないオブジェクトのハッシュでIDを作成します。したがって、賢明に言えば、すべてのオプションを取得できますが、IDはEmbedのIDとは異なります。

ありがとう、 リッキー。

関連する問題