Symfony表单创建新对象并创建第一个一对多对象

时间:2014-03-04 22:45:04

标签: forms symfony doctrine-orm doctrine

我有一个支持票证的实体:SupportTicket()。我还有一个回复每张票的条目:SupportEntry()。我在SupportTicket()和SupportEntry()之间建立了一对多的关系。

现在我要做的是构建我的表单,以便创建初始SupportTicket然后插入第一个SupportEntry,所有这些都以相同的形式。我一直在搞乱我的代码,只有一半了解我在做什么,但这就是我现在所处的位置:

// My controller, creating the form
$supportTicket = new SupportTicket();

    $form = $this->createFormBuilder($supportTicket)
        ->add('subject', 'text', array(
            'label'         => 'Subject'
        ))
        ->add('jobNumber', 'text', array(
            'label'         => 'Job Number'
        ))
        ->add('supportGroup', 'entity', array(
            'label'         => 'Group',
            'class'         => 'ShawmutClientBundle:SupportGroup',
            'property' =>   'name',
            'multiple'      => true,
            'expanded'      => true
        ))
       // ->add('supportEntries', new SupportEntryType())
        ->add('supportEntries', new SupportEntryType())

        ->add('Save', 'submit')

        ->getForm();

我尝试自定义表单类型

<?php
namespace Shawmut\ClientBundle\Form\Type;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;

class SupportEntryType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
    $builder->add('comment', 'textarea');
}

public function setDefaultOptions(OptionsResolverInterface $resolver)
{
    $resolver->setDefaults(array(
        'data_class' => 'Shawmut\ClientBundle\Entity\SupportEntry',
    ));
}

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

表单确实有我从表单类型中提取的注释框,但是当我尝试提交表单时,我收到此错误:

  

属性“supportEntries”和方法“setSupportEntries()”,“_ set()”或“ _call()”之一都不存在,并且在“Me \ MyBundle”类中具有公共访问权限\实体\ SupportTicket”。

是的,这是有道理的。它应该是addSupportEntries()方法。那么如何告诉表单构建器使用addSupportEntries而不是setSupportEntries?

提前致谢

2 个答案:

答案 0 :(得分:2)

collection表单类型设为go。

->add(
    'supportEntries',
    'collection',
    array(
        'type' => new SupportEntryType(),
        'label' => 'Support Entries',
        'error_bubbling' => true,
        'cascade_validation' => true,
    )
)

答案 1 :(得分:0)

如果您使用的是集合表单类型,并且未显示textarea,请添加:

'allow_add'    => true

到属性array()。 代码看起来像这样:

->add(
'supportEntries',
'collection',
array(
    'type' => new SupportEntryType(),
    'label' => 'Support Entries',
    'error_bubbling' => true,
    'allow_add'    => true
    'cascade_validation' => true,
)

要显示小部件,假设您正在使用树枝:

  {{ form_widget(form.supportEntries.vars.prototype.comment) }}

为了保存支持条目,根据您构建实体的方式,您可能需要进行一些额外的修改。

文档应该可以帮助您做到正确: How to Embed a Collection of Forms