4

コレクション付きのフォームを表示しようとしています。コレクションは空のサブフォームを表示する必要があります。プロジェクトの性質上、JavaScriptに頼ることはできません。

グーグルは役に立たず、コレクションフィールドに空のエンティティを追加しても機能しないようです。

私がこれまでに持っているもの:

public function indexAction($id)
{
    $em = $this->getDoctrine()->getManager();
    $event = $em->getRepository('EventBundle:EventDynamicForm')->find($id);

    $entity = new Booking();
    $entity->addParticipant( new Participant() );
    $form   = $this->createForm(new BookingType(), $entity);

    return array(
        'event' => $event,
        'edit_form' => $form->createView()
    );
}

BookingType.phpでbuildForm()

$builder
    ->add('Participants', 'collection')

Twigテンプレートで

{{ form_row(edit_form.Participants.0.companyName) }}

$ entity-> addParticipant(new Participant());という行を入力すると、indexAction()で、次のようなエラーが発生します。

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

上記の行を削除すると、Twigは次のように文句を言います。

オブジェクト「Symfony\Component \ Form \ FormView」のメソッド「0」は、/ Applications / MAMP / htdocs / symfony-standard-2.1 / src / Yanic / EventBundle / Resources / views / Booking/index.html.twigに存在しません。 27行目

編集:addParticipantは、doctrine:generate:entitiesコマンドによって生成されるデフォルトの方法です

/**
 * Add Participants
 *
 * @param \Yanic\EventBundle\Entity\Participant $participants
 * @return Booking
 */
 public function addParticipant(\Yanic\EventBundle\Entity\Participant $participants)
 {
     $this->Participants[] = $participants;

     return $this;
 }

私は何か間違ったことをしていると確信していますが、手がかりを見つけることができません:-(

4

2 に答える 2

7

すでにhttp://symfony.com/doc/current/cookbook/form/form_collections.htmlを読んでいると思いますが、Symfony2フォームコレクションに少し迷っていると思います。
ここでは、ドキュメントを強調し、他のSO読者を支援し、質問に答えるのに少し練習します。.:)

まず、少なくとも2つのエンティティが必要です。あなたの場合、BookingそしてParticipant。予約エンティティに、以下を追加します。Doctrineを使用しているため、Participantでラップする必要がありますArrayCollection

use Doctrine\Common\Collections\ArrayCollection;

class Booking() {

    // ...

    protected $participants;

    public function __construct()
    {
        $this->participants = new ArrayCollection();
    }

    public function getParticipants()
    {
        return $this->participants;
    }

    public function setParticipants(ArrayCollection $participants)
    {
        $this->participants = $participants;
    }
}

次に、参加者エンティティは何でもかまいません。ちょうど例:

class Participant
{
    private $name;

    public function setName($name) {
        $this->name = $name;

        return $this;
    }

    public function getName() {
        return $this->name;
    }
}

第3に、BookingTypeには、次のようなParticipantTypeのコレクションが含まれている必要があります。

// ...
$builder->add('participants', 'collection', array('type' => new ParticipantType()));

第4に、ParticipantTypeは単純です。前の私の例によると:

// ...
$builder->add('name', 'text', array('required' => true));

最後に、BookingControllerで、コレクションを作成するために必要な数の参加者を追加します。

// ...
$entity = new Booking();

$participant1 = new Participant();
$participant1->name = 'participant1';
$entity->getParticipants()->add($participant1); // add entry to ArrayCollection

$participant2 = new Participant();
$participant2->name = 'participant2';
$entity->getParticipants()->add($participant2); // add entry to ArrayCollection
于 2013-02-28T06:29:14.240 に答える
0

ここにタイプを追加する必要があると思います:

 ->add('Participants', 'collection', array('type' => 'YourParticipantType'));

モデルからのaddParticipant関数の宣言もここに貼り付けていただけますか?何か怪しいものもあるようです。

于 2013-02-27T07:23:02.683 に答える