Symfony 2 Forms:将视图数据存储在数组中,稍后恢复条件

时间:2012-11-26 06:18:25

标签: symfony symfony-2.1

我尝试在会话中保存表单值。

1)点击page1

上的“更改类别”按钮

2)在会话中存储数据

3)重定向到page2

4)使用此保存的表单数据执行一些更改并在会话中更新

5)重定向回page1并按会话

中存储的值恢复表单值
$product = new Product;

$productType = new ProductType;
$form = $this->createForm($productType, $product);

//get values from session
$form_values_in_session = ...

if ($request->isMethod('POST')) {
    $form->bind($request);

    // if click on change category button
    if ($request->request->get('category')) {
        $form_raw_values = $request->get($productType->getName());

        $form_values = array();
        foreach ($form_raw_values as $form_field_name => $form_field_value) {
            if ($form->has($form_field_name)) {
                $form_values[$form_field_name] = $form_field_value;
            }
        }

        // store this data in session
        // and redirect
        return $this->redirect($this->generateUrl();
    }

    if ($form->isValid()) {
        // form submit
    }
} else if ($form_values_in_session) {
    $form->bind($form_values_in_session);
}

工作正常,但问题形式正在$form->bind($form_values_in_session);调用后验证,我在页面上看到表单错误。

正确的方法:为$product调用setter,但在这种情况下我需要手动转换视图数据 - >规范数据 - >模型数据。 Form类中的这些方法是私有的,我需要从Form :: viewToNorm,Form :: normToModel等方法中复制一些代码。

有更好的方法吗?

1 个答案:

答案 0 :(得分:0)

这个想法只是使用root表单进行表单验证工作。这意味着我可以绑定表格儿童的数据

foreach ($form->all() as $name => $field) {
    if (isset($form_values_in_session[$name])) {
        $field->bind($form_values_in_session[$name]);
    }
}