0

我有这个表单生成器:

    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->add('task', 'text', array('label' => 'Task'))
                ->add('dueDate', 'date', array('label' => 'Date', 'format' => 'ddMMMMyyyy'))
                ->add('category', 'entity', array('required' => true, 'multiple' => true, 'class' => 'AcmeTaskBundle:Category', 'query_builder' => function($repository) { return $repository->createQueryBuilder('c')->orderBy('c.id', 'ASC'); },))
                ->add('save', 'submit', array('label' => 'Send'));
    }

它与这个控制器一起工作成功:

if($form->isValid())
{
    $this->get('session')->getFlashBag()->add(
        'success',
        'Task successfuly added'
    );
    $em = $this->getDoctrine()->getManager();
    foreach($form->get('category')->getData() as $cat)
    {
        $task->removeCategory($cat);
        $task->addCategory($cat);
    }
    $em->persist($task);
    try {
        $em->flush();
    } catch (\PDOException $e) {
        // sth
    }
}

如果我尝试将我的表单嵌入到这样的字段类别中:

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder->add('task', 'text', array('label' => 'Task'))
            ->add('dueDate', 'date', array('label' => 'Date', 'format' => 'ddMMMMyyyy'))
            ->add('category', new CategoryType())
            ->add('save', 'submit', array('label' => 'Send'));
}

我的 CategoryType 如下所示:

public function setDefaultOptions(OptionsResolverInterface $resolver)
{
    $resolver->setDefaults(array(
        //'data_class' => 'Acme\TaskBundle\Entity\Category',
        'csrf_protection' => true,
    ));
}

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder->add('name', 'entity', array(
                  'class' => 'AcmeTaskBundle:Category',
                  'query_builder' => function($repository) { return $repository->createQueryBuilder('c')->orderBy('c.id', 'ASC'); },
                  //'property' => 'name',
                  'multiple' => true,
                  'required' => true,
                  ));
}

它返回一个预期类别的异常实例,给定 ArrayCollection。为什么“相同”的表单只有在没有嵌入的情况下才有效?

4

1 回答 1

1

这两种类型并不相同。在第一种情况下,您使用选项'multiple' => true,这意味着表单需要类别实体的集合。从您的控制器中,我看到您具有 (One|Many)-To-Many 关系 Task-Category。这里的类别是类别实体的 ArrayCollection,因此您的表单正在工作。

在第二种情况下,->add('category', new CategoryType())这意味着 Category 可以是唯一的,根据您的控制器和 Task 实体,这不是真的。您需要在CategoryType()此处创建集合。

->add('category', 'collection', array('type' => new CategoryType()))

此外,我认为您必须为这条线提供更多选项以适合您的应用程序。

于 2013-10-05T05:07:28.157 回答