我已经定义了这样的自定义表单:
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);
DogType
和UserType
只有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
答案 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就是这样做的。 我做出这个答案,这对其他人有用。