1

A と B の 2 つのエンティティがあります。A は B と 1 対多の関係にあります。

collectionフィールド タイプを使用して、A フォーム内に 5 つの B フォームを埋め込んでいます。それを得るために、私は 5 つの AB リレーションを作成していAControllerます。私がやりたいのは、この各Bエンティティのフィールドを使用して、フォーム コレクションにラベルを作成することです。

だから、私は次のコードを持っています:

//AController
$a = new A();

//Followinf returns an array of 5 B entities
$bs = $this->getDoctrine->getEntityManager()->getRepository('MyBundle:B')->findBy(array(
   'field' => 'value',
));

foreach ($bs as $b) {
   $a->addB($b);
}

$form = $this->createForm(new AType(), $a);

return array(
   'a' => $a,
   'form' => $form->createView(),
);

//AType
public function buildForm(FormBuilderInterface $builder, array $options)
{
   $builder
      ->add('a_field')
      ->add('another_field')
      ->add('bs', 'collection', array(
               'type' => new BType(),
               'options' => array(
                  'label' => 'i want to configure it depending on current B data',
                  )
               ))
      ;
}

この関連トピックを見つけました:

symfony フォーム - CollectionType 内の子エントリ Type 内のエンティティへのアクセス

ただし、子フォームのデータにアクセスするため、これは異なることに注意してください。親フォームから子データにアクセスし、コレクション内の各子ラベルに使用したいと考えています。

を使用して子データにアクセスできることはわかって$builder->getData()->getBs();いますが、後で子フォームごとに使用する方法がわかりません。

ビューでエンティティをループし、ループ インデックスを使用して各コレクション要素を手動でレンダリングすることもできますが、フォームで実行したいと思います。

どうもありがとう。

4

1 に答える 1

1

私はあなたが欲しいと思います:

public function buildForm(FormBuilderInterface $builder, array $options)
{
   $data=someProcessingFunction($builder->getData()->getBs());
   $builder
      ->add('a_field')
      ->add('another_field')
      ->add('bs', 'collection', array(
               'type' => new BType(),
               'options' => array(
                  'label' => $data,
                  )
               ))
      ;
}

おそらく関連するものとして、別の $builder->add 呼び出しで最後に何かを追加できます。

public function buildForm(FormBuilderInterface $builder, array $options)
{
   $builder->add('a_field');
   $builder->add('another_field');
   $data=someProcessingFunction($builder->getData()->getBs());
   $builder->add('bs', 'collection', array(
               'type' => new BType(),
               'options' => array(
                  'label' => $data,
                  )
               ))
      ;
}

それぞれに一意のラベルを付けたい場合は、この 2 番目のアプローチが次のように優れています。

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

   $data=someProcessingFunction($builder->getData()->getBs());
   foreach ($data as $k=>$v){
   $builder->add('b'.$k, null, array(
                  'label' => $v,
               ))
      ;
   }
}

または類似

于 2013-01-03T22:20:58.893 に答える