Symfony2とImでは、Symfony2がどのようにViewコンポーネントのポリモフィックコレクションを扱うのか不明です。私はAbstractChildrenのコレクションを持つエンティティを作成できますが、Form Typeクラスの中でどのように行うかについてはわかりません。Symfony2フォームとポリモーフィックコレクション
たとえば、次のエンティティの関係があります。
/**
* @ORM\Entity
*/
class Order
{
/**
* @ORM\OneToMany(targetEntity="AbstractOrderItem", mappedBy="order", cascade={"all"}, orphanRemoval=true)
*
* @var AbstractOrderItem $items;
*/
$orderItems;
...
}
/**
* Base class for order items to be added to an Order
*
* @ORM\Entity
* @ORM\InheritanceType("JOINED")
* @ORM\DiscriminatorColumn(name="discr", type="string")
* @ORM\DiscriminatorMap({
* "ProductOrderItem" = "ProductOrderItem",
* "SubscriptionOrderItem " = "SubscriptionOrderItem "
* })
*/
class AbstractOrderItem
{
$id;
...
}
/**
* @ORM\Entity
*/
class ProductOrderItem extends AbstractOrderItem
{
$productName;
}
/**
* @ORM\Entity
*/
class SubscriptionOrderItem extends AbstractOrderItem
{
$duration;
$startDate;
...
}
シンプルに十分な、しかし、イムは、私のためにクラスのフォームを作成するとき
class OrderType extends AbstractType
{
public function buildForm(FormBuilder $builder, array $options)
{
$builder->add('items', 'collection', array('type' => AbstractOrderItemType()));
}
}
私はあなたが効果的に内のアイテムのクラスごとに異なるフォームタイプを必要とするこのような状況に対処する方法がわかりませんよコレクション?あなたはこれらの形態の両方を追加したものproductOrderはとSubscriptionOrderのためにあなたのOrderTypeフォームクラスで
class ProductOrderType extends AbstractType
{
public function buildForm(FormBuilder $builder, array $options)
{
//Form elements related to Product Order here
}
}
と
class SubsciptionOrderType extends AbstractType
{
public function buildForm(FormBuilder $builder, array $options)
{
//Form elements related SubscriptionOrder here
}
}
を別のフォームクラスを作成しなければならないあなたが与えるれている例では
Symfony2でこれを動作させる方法はありますか?具体的には、 "$ child-> getConfig() - > getOptions();" 2.0では利用できません。そのため、フォームの元のオプションは取得できません。私がオプションを残しておけば、最終的に "Doctrine \ ORM \ PersistentCollection"クラスには "最終的にプロパティ" 0 "もメソッド" get0() "もメソッド" is0() "も存在しません – CriticalImpact
@CriticalImpact 2.0 Formコンポーネントのソースであり、実際には同じ効果を実現する方法は見当たりません(オプションは長期間保存されません)。常にデフォルトのオプションを使用しています - 上記のエラーを解決するには、property_pathを適切に設定する必要があります(残念ながら、コレクションのプロパティパスに2.0が使用する形式 –
私はFormEvents :: PRE_SET_DATAのイベントリスナーを追加し、バッキングオブジェクト(私の場合は質問オブジェクト)を取得し、タイプを決定しました。質問(私は何かが私のキューに入っているチェックボックス、はい/いいえ、テキストフィールドなど)を入力し、質問オブジェクトに設定されているタイプに基づいてフォームにフィールドを追加します。 – CriticalImpact