【问题标题】:Symfony form creates new object and create first one-to-many objectSymfony 表单创建新对象并创建第一个一对多对象
【发布时间】:2014-03-04 22:45:04
【问题描述】:

我有一个支持票的实体: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”类中具有公共访问权限\Entity\SupportTicket”。

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

提前致谢

【问题讨论】:

  • 很确定使用集合可以完成这项工作。 ->add('supportEntries', 'collection', array('type' => new SupportEntryType())) symfony.com/doc/current/cookbook/form/form_collections.html
  • 谢谢。这看起来像是要走的路,但我不知道如何渲染文本区域。如果我将 allow_add 和 protype 包含为 true,它似乎会进入模板,但是我必须使用 Javascript 呈现该字段。然后,它不会在表单中正确传递值。目前有点卡住了。
  • 在您的 SupportTicket 中添加一个 SupportEntry,以便表单系统可以处理。

标签: forms symfony doctrine-orm doctrine


【解决方案1】:

试试collection 表单类型。

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

【讨论】:

  • 感谢您的回答,但仍然无法正常工作。问题是该集合包含标签,但我的 SupportEntryType 中的“评论”文本区域未显示。尝试提交表单显示 textarea 的值不能为空,因此看起来表单正确但 textarea 未显示。知道为什么会发生这种情况吗?
  • 问题似乎与原型有关。如果我将其保留为 false,则在 div 中呈现时不会显示任何内容。当我设置为 true 时,它​​会吐出这个损坏的 HTML:pastebin.com/cYGDHbih
【解决方案2】:

如果您使用的是集合表单类型,并且没有显示文本区域,请添加:

'allow_add'    => true

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

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

)

要显示小部件,假设您使用的是 twig:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-19
    相关资源
    最近更新 更多