0

独自のテンプレートでレンダリングするためにコレクションフォームを拡張しようとしています...

class ContactFieldType extends AbstractType
{
  public function setDefaultOptions(OptionsResolverInterface $resolver)
  {
    $resolver->setDefaults(array(
      'collection' => array('type' => new ContactType())
    ));
  }

  public function getParent()
  {
    return 'collection';
  }

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

そして、私はこのタイプを次のように使用します。

$builder->add('contacts',new ContactFieldType(), array(
  'label_attr' => array('class' => 'contacts')
));

次のエラーが表示されます。

フォームのビュー データは、タイプがスカラー、配列、または \ArrayAccess のインスタンスであると予想されますが、クラス MyApp\MainBundle\Entity\Contact のインスタンスです。このエラーを回避するには、「data_class」オプションを「MyApp\MainBundle\Entity\Contact」に設定するか、クラス MyApp\MainBundle\Entity\Contact のインスタンスをスカラー、配列、または \ のインスタンスに変換するビュー トランスフォーマーを追加します。配列アクセス。

私がこれを使用する場合:

$builder->add('contacts','collection', array(
  'type' => new ContactType(),
  'label_attr' => array('class' => 'contacts')
));

それは正常に動作します。

提案されているように、この data_class を実装したくありません... コレクション ウィジェットを拡張したい

4

1 に答える 1

1

あなたのフォーム定義は問題ないようで、これ以上いじる必要はありません。あなたの問題はインスタンス化にあります。

私が見たところ、あなたは多かれ少なかれそのようにフォームをインスタンス化していると思います:

$model = new ParentClass();
$model->setContacts(new Contact());

$form = $this->createForm(new ParentFormType(), $model));

ただし、コレクションフォーム タイプは、Contact()インスタンスを使用して動作するのではなく、そのようなインスタンスの配列を使用します。

そのようなオブジェクトの配列の代わりに Contact() インスタンスを使用してインスタンス化すると、コードは失敗します。あなたがする必要があるのは:

$model = new ParentClass();
$model->setContacts(array(new Contact()));

$form = $this->createForm(new ParentFormType(), $model));

これはあなたがしたことだと私は信じていますが、あなたはインスタンス化コードを提出していないので、私が正しいかどうかを判断するのは難しいままです. 問題が解決しない場合は、提供することをお勧めします。

于 2013-12-10T16:28:20.737 に答える