1

セッションに保存するフォーム値を実装しようとしています。

1) 「カテゴリの変更」ボタンをクリックします。page1

2) セッションにデータを保存する

3) にリダイレクトpage2

4) この保存されたフォーム データでいくつかの変更を実行し、セッションで更新します。

page15)セッションに保存された値によってフォームの値にリダイレクトして復元する

$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が、この場合、ビュー データ -> ノルム データ -> モデル データを手動で変換する必要があります。クラス内のそのようなメソッドFormはプライベートであり、メソッド Form::viewToNorm、Form::normToModel などからいくつかのコードをコピーペーストする必要があります。

より良い方法はありますか?

4

1 に答える 1

0

アイデアは、フォーム検証がルートフォームのみで機能することです。つまり、フォームの子のデータをバインドできます

foreach ($form->all() as $name => $field) {
    if (isset($form_values_in_session[$name])) {
        $field->bind($form_values_in_session[$name]);
    }
}
于 2012-11-26T13:32:12.803 に答える