初始化自定义类型表单数据

时间:2016-02-11 15:43:57

标签: symfony symfony2-forms

我已经定义了这样的自定义表单:

class EditOwnerProfileType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add("user", new UserType())
            ->add("dog", new DogType())
            ->add('save', 'submit');
    }

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

我想创建此表单并使用以下数据初始化它:

    $user = new User();
    $user->setLatitude(1.1)
        ->setLongitude(2.2)
        ->setAddress("custom address");

    $dog = new Dog();
    $dog->setDogName("Bruno")
        ->setDogSize("small")
        ->setDogBreed("Bulldog");

    $formData = array(
        "user" => $user,
        "dog" => $dog
    );

    $form = $this->createForm(new EditOwnerProfileType(), $formData, array("csrf_protection" => false))->handleRequest($request);

DogTypeUserType只有NotBlank个约束

每当我想验证数据时,它总是会抛出每个字段的错误:

"errors": {
  "user": {
    "latitude": [
      "This value should not be blank."
    ],
    "longitude": [
      "This value should not be blank."
    ],
    "address": [
      "This value should not be blank."
    ]
  },
  "dog": {
    "dogName": [
      "This value should not be blank."
    ],
    "dogSize": [
      "This value should not be blank."
    ],
    "dogBreed": [
      "This value should not be blank."
    ]
  },

我不认为我正在初始化所有值吗?那么,如果用户没有为该字段传递任何值,则使用我定义的值初始化? 哪个是在EditOwnerProfileType表单上初始化值的正确方法?

编辑:我试图改变表单创建(仅用于测试),但也没有用。

$form = $this->createForm(new EditOwnerProfileType(), $formData, array("csrf_protection" => false));
$form->setData($formData);
$form->handleRequest($request);

EDIT2:包含DogType和UserType代码

class DogType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('name')
            ->add('dogSize')
            ->add('dogBreed')            
        ;
    }    

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

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

class UserType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('latitude')
            ->add('longitude')
            ->add('address')
        ;
    }

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

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

我正在使用Symfony 2.7.9

1 个答案:

答案 0 :(得分:0)

我回答我自己的问题,问题是...... 我误解了Symfony Form Component。

我可以将表单初始化为:

$user = new User();
$user->setLatitude(1.1)
    ->setLongitude(2.2)
    ->setAddress("custom address");

$dog = new Dog();
$dog->setDogName("Bruno")
    ->setDogSize("small")
    ->setDogBreed("Bulldog");

$formData = array(
    "user" => $user,
    "dog" => $dog
);

$form = $this->createForm(new EditOwnerProfileType(), $formData, array("csrf_protection" => false))

此时,表单已正确初始化,并且所有字段都具有正确的值。

在请求edit_owner[dog][name]=othername中传递一个参数并执行:

$form->handleRequest($request);

我希望只更改edit_owner[dog][name](其余字段保持其默认值),但我注意到表单的其余字段已处理并解析为blank值,取代了我的“初始值”。

这就是问题,Symfony就是这样做的。 我做出这个答案,这对其他人有用。