0

何らかの理由で、いくつかのデータを分離する必要があり、現在は 3 つのエンティティがあります。

  • 注文
  • 発注会社
  • 最終ユーザー

現在、Order には deliveryPlace などの基本データがあり、OrderingCompany および FinalUser と 1 対 1 の関係にあります。

ここで、ある形式で、ユーザーに注文データだけでなく、注文会社と最終ユーザーに関するすべての情報を指定させたいと考えています。OrderingCompany と FinalUser を多くのフィールドに埋め込むにはどうすればよいですか。エンティティ タイプでは 1 つのフィールドしか選択できないためです。

フォームを手動で処理することを考えていましたが、handleRequest を処理するのはまったくの地獄です。

では、どうすればよいのでしょうか。

4

1 に答える 1

3

OrderingCompany と FinalUser の 2 つの (複合) フィールドで注文フォームを作成する必要があります。これらのフィールドは両方とも、独自の型で表すことができます (必須ではありません)。

以下の例では、手っ取り早いので、手動でフォームを作成します。あなたがすることを禁じるものは何もありませんフィールドの構造を別の型に抽出します。

<?php

class Order extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('orderdata') // orderdata should exist on order entity
            ->add('finalUser', new FinalUserType)
            // same with OrderingCompany
        ;
    }

    public function getName()
    {
        return 'order';
    }
}

   

class FinalUserType extends AbstractType {

    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->add('name');
    }

    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults(array('data_class' => 'FinalUser'));
    }
}

オプション 2

別の可能性があります: プロパティ パスを使用して、フォーム フィールドをエンティティ グラフの基になるオブジェクトに直接マップします (グラフに正しいインスタンスがあると仮定します)。

<?php

class Order extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('orderdata') // orderdata should exist on order entity
            ->add('finalUserName', 'text', array(
                'property_path' => 'finalUser.name' // $order->getFinalUser()->(get|set)Name() will be called
            ))
        ;
    }
}
于 2013-07-03T11:11:10.643 に答える