【问题标题】:Initialize custom type form data初始化自定义类型表单数据
【发布时间】: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);

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

【问题讨论】:

  • 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有一些重大变化。

标签: symfony symfony2-forms


【解决方案1】:

我回答我自己的问题,问题是...... 我误解了 Symfony 表单组件。

我可以像这样初始化表单:

$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 就是这样工作的。 我做出这个答案是为了对其他人有用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-28
    • 2011-12-18
    • 1970-01-01
    • 2017-11-16
    • 2011-08-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多