1

フォームの作成と変更に Symfony2 フォーム コンポーネントを使用しています。現在、すべてのモデル エンティティを選択肢として読み込んでいますが、選択した (投稿された) 値に関連するモデルのみを製造元から取得する必要があります。

どうすればこれを達成できますか?

class VehicleType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->add('manufacturer', 'entity', array(
            'label' => 'Brand',
            'attr' => array('class' => 'input-block-level'),
            'class' => 'BalslevCarBundle:Manufacturers',
            'property' => 'short_name',
            'empty_value' => 'All',
            'required' => false
        ));
        $builder->add('model', 'entity', array(
            'label' => 'Model',
            'class' => 'BalslevCarBundle:Models',
            'property' => 'model',
            'empty_value' => 'All',
            'required' => false
        ));
    }

    public function getName()
    {
        return 'search';
    }
}
4

1 に答える 1

0

まず第一に、ユーザーの選択に基づいて選択肢を「動的に」作成する必要があります。
アプリケーションの動作と厳密に結びついて、(どちらの場合も) 同じ「コア」コードにつながる 2 つの方法があります。違いは、呼び方だけです。

それでは、2 つの可能性について説明しましょう。

  1. 製造元を「静的に」選択し、要求時に変更しないでください: ビジネス ロジックから取得したデータを使用します
  2. 製造元を「動的に」選択し、要求に応じて変更できます。要求ごとにフォームを交換してください。新しいフォームはビジネス ロジックによって提供されます

したがって、あなたの質問の核心は、関連付けられたエンティティのみを取得するにはどうすればよいですか?

答え

VehicleType.php に (この場合のエンティティは VehicleType ですか?)

private $manufacturerId;

public function __construct($manufacturerId)
{
    $this->manufacturerId = $manufacturerId;
}

public function BuildForm(FormBuilderInterface $builder)
{
    $manufacturerId = $this->manufacturerId;

    $manufacturerQuery = function(EntityRepository $repo) use ($manufacturerId ){
                              return $repo->createQueryBuilder('m')
                                          ->where('m.id = :id')
                                          ->setParameter('id',$manufacturerId );};

    $builder->add('manufacturer', 'entity', array(
        'label' => 'Brand',
        'attr' => array('class' => 'input-block-level'),
        'class' => 'BalslevCarBundle:Manufacturers',
        'property' => 'short_name',
        'empty_value' => 'All',
        'required' => false,
        'query_builder' => $manufacturerQuery;
    ));

    $builder->add('model', 'entity', array(
        'label' => 'Brand',
        'attr' => array('class' => 'input-block-level'),
        'class' => 'BalslevCarBundle:Manufacturers',
        'property' => 'short_name',
        'empty_value' => 'All',
        'required' => false,
        'query_builder' => $modelQuery;
    ));
}

ご覧のとおり、このようにカスタム リポジトリを使用して、ニーズに適したエンティティのみを取得します。明らかに、DB 構造を知らずに DQL クエリを書いています。それを実際の状況に適応させるのはあなたの仕事であり責任です。

$modelQueryさらに、選択したモデルに基づいて正しいモデルを取得するには、モデルの別のクエリを作成する必要があります (私の回答で呼び出されます)。$id

于 2013-03-08T10:02:27.887 に答える