8

1つのフォームタイプを取得して表示しようとしていますが、ユーザーがパッチアップロードを一度にアップロードする必要がある場合があります。つまり、アップロードするファイルが30個、ページにフォームが30個あるとします。このエラーが発生しました:

フォームのビューデータは、スカラー型、配列型、または\ ArrayAccessのインスタンスであることが期待されていますが、クラスMS \ CoreBundle \ Entity\Photoのインスタンスです。このエラーを回避するには、「data_class」オプションを「MS \ CoreBundle \ Entity \ Photo」に設定するか、クラスMS \ CoreBundle \ Entity \ Photoのインスタンスをスカラー、配列、または\のインスタンスに変換するビュートランスフォーマーを追加します。 ArrayAccess。

ギャラリータイプコードは次のとおりです。

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder->add('photo', 'collection', array(
        'type' => new PhotoType(),
        'allow_add' => true,
        'data_class' => 'MS\CoreBundle\Entity\Photo',
        'prototype' => true,
        'by_reference' => false,
    ));
}

写真タイプコードは次のとおりです。

public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->add('description', 'text', array('label' => "Title:", 'required' => true))
                ->add('File')
                ->add('album', 'entity', array(
                    'class' => 'MSCoreBundle:Album',
                    'property' => 'title',
                    'required' => true,
                    'query_builder' => function(EntityRepository $er)
                    {
                        return $er->createQueryBuilder('a')
                            ->orderBy('a.title', 'ASC');
                    },
                ))
        ;
    }

    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => 'MS\CoreBundle\Entity\Photo',
        ));
    }

私のコントローラー機能は次のとおりです。

     public function newAction($count)
        {
            for($i = 1; $i <= $count; $i++) {
                $entity = new Photo();
            }

            $form = $this->container->get('ms_core.gallery.form');
            $form->setData($entity);

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


  }

どんな助けでも素晴らしいでしょう。

4

1 に答える 1

11

GalleryTypeのコレクションタイプdata_classにオプションを渡さないでください。または、PhotoTypeのデフォルト(すでに設定されているので、そうする必要はありません)をオーバーライドする場合は、次のようにオプション配列で指定できます。

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder->add('photo', 'collection', array(
        'type' => new PhotoType(),
        'allow_add' => true,
        'options' => array('data_class' => 'MS\CoreBundle\Entity\Photo'),
        'prototype' => true,
        'by_reference' => false,
    ));
}

「GalleryType」にデフォルトのオプションが設定されていることを確認してください。アルバムである必要があります。data_class

また、コントローラーでフォームが正しく作成されていません。setData()フォームのデータ型(この場合はアルバム)で呼び出す必要があります。

public function newAction($count)
{
        $album = new Album();
        for($i = 1; $i <= $count; $i++) {
            $album->addPhoto(new Photo());
        }

        $form = $this->container->get('ms_core.gallery.form');
        $form->setData($album);

        return array(
            'entity' => $album,
            'form' => $form->createView()
        );
}
于 2012-06-27T20:17:15.010 に答える