【问题标题】:How to do a form in some steps in Symfony2 - Step Validation如何在 Symfony2 中的某些步骤中执行表单 - 步骤验证
【发布时间】:2013-07-22 15:11:39
【问题描述】:

我想在 Symfony2(完全是 2.3)中的某些步骤中创建一个表单,但是当我尝试这样做时,我的表单中出现错误。

我已经做了下一个:

1) 我创建了一个类

class MyClass
{
/**
 * @var integer
 *
 * @ORM\Column(name="id", type="integer")
 * @ORM\Id
 * @ORM\GeneratedValue(strategy="AUTO")
 */
private $id;

/**
 * @var string
 *
 * @ORM\Column(name="name", type="string", length=255)
 * @Assert\NotNull()
 */
private $name;

/**
 * @var string
 *
 * @ORM\Column(name="surname", type="string", length=255)
 * @Assert\NotNull()
 */
private $surname;
}

2) 我创建了 FormType 类:

class MyClassType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder
        ->add('name', null, array('label' => 'name'))
        ->add('surname', null, array('label' => 'surname'));     
}

我又创建了 2 个类来分离获取表单数据的过程:

class MyClass1Type extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder
        ->add('name', null, array('label' => 'name'));     
}

class MyClass2Type extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder
        ->add('surname', null, array('label' => 'surname'));     
}

在控制器中我有一些方法:

public function new1Action()
{
    $entity = new MyClass();
    $form   = $this->createForm( new MyClass1Type( $entity );

    return array(
        'entity' => $entity,
        'form'   => $form->createView(),
    );
}

public function new2Action(Request $request)
{
    $entity  = new MyClass();
    $formMyClass1 = $this->createForm(new MyClass1Type($entity) );
    $formMyClass1->bind($request);

    if (!$formMyClass1->isValid()) {
        print_r($formMyClass1->getErrors());
        return new Response("Error");
    }

    $form   = $this->createForm( new MyClass2Type($entity) );

    return array(
        'entity' => $entity,
        'form'   => $form->createView(),
    );
}

我渲染了第一个表单(new1Action),它完美地获取了数据,但问题是我提交数据的时候。在 new2Action 中,应用程序会抛出 response("error") 代码,因为表单无效。 print_r() 函数显示下一条信息:

Array ( [0] => Symfony\Component\Form\FormError Object ( [message:Symfony\Component\Form\FormError:private] => Este valor no debería ser null. [messageTemplate:protected] => This value should not be null. [messageParameters:protected] => Array ( ) [messagePluralization:protected] => ) ) 

我认为问题在于第一个表单中获取的数据类不完整,但我需要将表单分为两步,我不知道如何处理此错误。

有人可以帮我吗?

提前致谢。

【问题讨论】:

    标签: forms validation symfony symfony-2.3


    【解决方案1】:

    将您的实体与 MyClass1Type 绑定后,您的实体有一个有效的名称但没有姓氏。 $myFormClass1->isValid() 返回 false,因为它尝试验证实体并且您没有指定验证部分数据,所以它不喜欢 surname 为空。

    您应该使用验证组在部分数据上验证您的实体。在 Symfony 书中查看 here

    在您的表单中添加:

    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults(array(
            'validation_groups' => array('validationStep1'),
        ));
    }
    

    并使用@Assert\NotNull(groups={"validationStep1"}) 在您的实体上的@Assert 注释上定义您的验证组:

    /**
     * @var string
     *
     * @ORM\Column(name="name", type="string", length=255)
     * @Assert\NotNull(groups={"validationStep1"})
     */
    private $name;
    
    /**
     * @var string
     *
     * @ORM\Column(name="surname", type="string", length=255)
     */
    private $surname;
    

    【讨论】:

    • 非常感谢!!我从来没有读过这个,但它完全解决了我的问题。你有 +1 和勾号。问候!!
    • 太好了,这正是我要找的,但我仍然有些疑问。首先,在 MyClass2Type 中,您必须再次包含字段名称,因为如果没有,new3Action(将 MyClass2Type 与整个实体绑定)不会绑定实体中的名称字段,因为 MyClass2Type 中没有任何名称字段.此外,如果您将 name 字段与 read_only 属性一起放置,您可以通过 html 进行更改,因此不安全:(
    • 是的,你是正确的 name 属性,但如果你将它添加到 new3Action 你应该确保用户不能改变它。我处理的方式是在每一步之间的会话中保存实体。第一个屏幕显示 MyClass1Type,然后将其绑定到实体,将其保存到会话并显示 MyClass2Type。请确保在创建表单时从会话中获取实体。在这种情况下,您不需要在每种类型中定义所有字段。
    猜你喜欢
    • 1970-01-01
    • 2020-04-14
    • 1970-01-01
    • 1970-01-01
    • 2021-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-05
    相关资源
    最近更新 更多