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 的实例转换为标量、数组或 \ 的实例数组访问。

如果我删除 Twig 抱怨的上述行:

/Applications/MAMP/htdocs/symfony-standard-2.1/src/Yanic/EventBundle/Resources/views/Booking/index.html.twig 中不存在对象“Symfony\Component\Form\FormView”的方法“0”第 27 行

编辑: addParticipant 是由教义生成的默认方法: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

我猜你对 Symfony2 表单集合有点迷失了,尽管我认为你已经阅读了http://symfony.com/doc/current/cookbook/form/form_collections.html
在这里,我将只强调文档,帮助其他 SO 读者,并在回答问题时锻炼一下自己.. :)

首先,您必须至少有两个实体。在你的情况下,BookingParticipant。在 Booking 实体中,添加以下内容。因为你使用 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;
    }
}

其次,您的 Participant 实体可以是任何东西。举个例子:

class Participant
{
    private $name;

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

        return $this;
    }

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

第三,您的 BookingType 应包含 ParticipantType 的集合,如下所示:

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

第四,ParticipantType 很简单。根据我之前的例子:

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

最后,在 BookingController 中,添加必要数量的 Participant 以创建集合。

// ...
$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

think you have to add here the type:

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

Could you also paste in here the declaration of your addParticipant function from the model? Seems that there's something fishy too.

于 2013-02-27T07:23:02.683 回答