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));
}

注意:类型中没有设置默认选项。

然后我创建表单:

//Controller.php
 $form = $this->createForm(new PermissaoType($choices, $choicesData), $choicesData);

我的问题:但是当我对使用 POST getData() 发送的数据进行句柄请求() 时,不会返回表单的更改,只返回在 $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(在 $form->handleRequest() 和 $form->getData() 之后):

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

多谢。

我用下面的更改解决了:

  • 删除第二个$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)))

  • 窗体类型中,我'mapped' => false更改为'mapped' => true

感谢@Jovan佩罗维奇

如果我

没记错的话,你需要用表单的名称作为键封装传递的array

例如,如果您的 FormType 类中有类似的东西:

public function getName(){
    return 'some_form_name'
}

然后你应该通过:

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

或者,您可以在发送数据时封装数据。然后你可以按书做:

$form->handleRequest($request);

希望这有帮助...