【问题标题】:Symfony2, validation embedded and non-embedded forms with same parameters and different results?Symfony2,验证具有相同参数和不同结果的嵌入式和非嵌入式表单?
【发布时间】:2013-10-04 20:37:08
【问题描述】:

我有这个表单生成器:

    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 给定。 为什么“相同”的表单只有在没有嵌入的情况下才有效?

【问题讨论】:

    标签: php forms symfony


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 我正在使用多对多关系。许多任务不是一个类别。
    • 没关系。你有(一个|多)对多的关系。你有很多类别。
    • 是的,这是真的。我试试看,现在我的电脑无法访问,我的文件在哪里。到时候我会给你信息。
    • 所以它是:类别标签中的空白字段。没有选择,或其他任何东西。 0 个查询(1 个预期用于从数据库中选择类别列表)。
    • 问题解决了。您已经开始描述一个新问题:“为什么 CategoryType 的集合没有呈现表单?”。要找到这个问题的答案,您应该阅读文章symfony.com/doc/current/cookbook/form/form_collections.html
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-08-21
    • 1970-01-01
    • 2012-04-25
    • 1970-01-01
    • 2014-02-26
    • 2017-08-04
    • 1970-01-01
    相关资源
    最近更新 更多