Symfony2.6:表单用数组数据而不是实体处理请求

Symfony2.6: Form handle a request with array data instead entity

我有一个 FormType,它根据在创建该 FormType 时传递的数组创建复选框组:

//FormType.php

public function __construct(array $choices, array $choicesData)
{
    $this->choices = $choices;
    $this->choicesData = $choicesData;
}

public function buildForm(FormBuilderInterface $builder, array $options)
{
    foreach ($this->choices as $bundle => $class) {
        $choiceBuilder = $builder->create($bundle, 'form', array('virtual' => true));
        foreach ($class as $name => $perm) {
            $choiceBuilder->add(
                    $name, 'choice', array(
                    'choices' => $perm,
                    'multiple' => true,
                    'mapped' => false,
                    'expanded' => true,
                    'required' => 'false',
                    'label' => $name,
                    'data' => $this->choicesData[$bundle][$name]
                )
            );
        }
        $builder->add($choiceBuilder);
    }
    $builder->add('salvar', 'submit', array('label' => false));
}

注意:类型中没有setDefaultOptions。

然后我创建表单:

//Controller.php

 $form = $this->createForm(new PermissaoType($choices, $choicesData), $choicesData);

我的问题: 但是当我对使用 POST [=32= 发送的数据进行 handleRequest() 时]getData() 不会 return 表格的改变,只有在 $choicesData 处设置的改变。谁能帮我解决这个问题?

//Controller.php

if ($request->isMethod('POST')) {

    $form->handleRequest($request); // Not Work
    $data = $form->getData(); // Return $choicesData original
}

例子 $choiceData 原件:

array(
    'group1' => array(
                    'item1' => array('chk1' => false, 'chk2' => false, 'chk3' => false)
    )
);

提交的表单示例:

array(
'group1' => array(
                'item1' => array( 0 => 'chk1', 1 => 'chk3')
    )
);

示例 $choiceData returned(在 $form->handleRequest() 和 $form->getData() 之后):

array(
    'group1' => array(
                    'item1' => array('chk1' => false, 'chk2' => false, 'chk3' => false)
    )
);

非常感谢。

如果我没记错的话,你需要封装传递给array的表单名称作为key。

例如,如果您的 FormType 中有这样的内容 class:

public function getName(){
    return 'some_form_name'
}

那么你应该通过:

$data = array(
    'some_form_name' => $request->request->all() // Encapsulte `POST` data
);

$form->submit($data);

或者您可以在发送数据时封装数据。然后你就可以照章办事了:

$form->handleRequest($request);

希望这对您有所帮助...

我通过以下更改解决了问题:

  • 删除第二个 $choicesData 到 $this->createForm()

    $form = $this->createForm(new PermissaoType($choices, $choicesData));

  • 'data' => $this->choicesData[$bundle][$name]'data' => array_keys(array_intersect($this->choicesData[$bundle][$name], array(true)))

  • FormType中我把'mapped' => false改成了'mapped' => true

感谢@Jovan Perovic