【发布时间】:2016-02-11 15:43:57
【问题描述】:
我已经定义了一个这样的自定义表单:
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
【问题讨论】:
-
EditOwnerProfileType 的 data_class 是什么??
-
它没有data_class...是嵌入其他表单类型的自定义表单...我需要为它创建一个类吗?
-
我认为这是一种方式。问题似乎出在您在 buildForm 函数中初始化每个表单时。与实体相关的任何地方都没有用户或狗相关。因此,您需要在该行之后构建该实体或设置数据属性symfony.com/doc/current/reference/forms/types/form.html#data
-
DogType绑定到Dog类...而UserType绑定到User类...它的createForm 的第二个参数是data否? -
似乎应该可以。也许在问题中显示您的 DogType。当您在浏览器中查看表单时,您是否获得了预期值?您使用的是哪个版本的 S2? 2.8/3.0有一些重大变化。