1

スタック: symfony2/doctrine2/php/mysql

複数ページのフォームは 2 つのステップで構成されます。各ステップはコントローラーアクションで実現されます。

step1でフォームが表示されます。form-input は同じアクションで検証されます。フォームが有効な場合、ユーザーは 2 番目のステップ/アクションにリダイレクトされます。2 番目のステップでは、ユーザーは自分の入力を確認する必要があります。確認後、データをデータベースに保存する必要があります。

したがって、フォーム エンティティ/フォーム データは、2 番目のステップ/アクションで必要です。ただし、確認前にデータベースに保存したくありません。

本当にすべてのオブジェクトをシリアル化する必要がありますか? セッションに?より良いアプローチはありますか?

助言がありますか?

4

2 に答える 2

1

シリアル化を使用しようとしましたが、エンティティは「多くの」関連付けで非常に複雑です。したがって、シリアル化は遅すぎます。切り離した後も。

最初の解決策(簡略化):

最初のステップ/アクション内のセッションに POST 変数を保存します。

    $postParams = $this->getRequest()->request;

    $session = $this->getRequest()->getSession();
    if (!$session) {
        $session = new Session();
    }
    $session->set($sessionKey, $postParams);

2 番目のステップ/アクションでは、フォームを使用してエンティティを再作成しました。

    $cancellation = $manager->initCancellationSomehow();

    $session = $this->getRequest()->getSession();
    if (!$session) {
        $session = new Session();
    }

    $parameterBag = $session->get($sessionKey);

    $cancellation = $this->getCancellation($customerId);

    $form = $this->createForm(
        new CancellationType(),
        $cancellation,
        array(
            'em' => $this->getDoctrine()->getManager())
    );

    $form->bind($parameterBag->get('form'));

    [..]

2番目の解決策:

私の最初の考えは、キャンセルをデータベースに保存することでした。したがって、状態属性 ( active/ temp/ ..) を追加しました。未確認のキャンセルは としてマークされtempます。ユーザーが状態が から に変更されたことを確認したtemp場合active。一時コレクションは、低い優先度で実行されるガーバージ コレクターによって 1 時間後に削除されます。

ユーザーは、既にデータベースに保存されている最終的なキャンセルを確認する必要があるため、2 番目のソリューションが気に入っています。フロントエンドが期待どおりに動作しない場合、ユーザーはキャンセルが破損していることに気付くでしょう (たとえば、間違ったエントリが選択されたなど)。彼が確認した場合、状態のみが変更されます。安全だと感じます。最初のソリューションでは、ユーザーは何をデータベースに保存する必要があるかを確認しますが、今まで確認していません。不安を感じます。

于 2013-06-26T19:42:18.053 に答える
1

まず、投稿する前に、サーバー上のコントローラー アクションではなく、JavaScript を使用して入力を検証することをお勧めします。

データをセッションにシリアライズしたくない場合は、最初のアクションで受け取ったときに次のページに渡すだけで、2 番目のアクションに投稿できます。次のようなものを想像しています。

firstAction() {
  $exampleData = $_POST['exampleData'];
  // Do whatever you need, then pass the data on to the next page
  return $this->render('SomeBundle:Views:secondPage.html.php',
                       array('exampleData' => $exampleData));

2 番目のページでは、JavaScript を使用して $exampleData にアクセスし、それをフォーム内の非表示の入力フィールドに配置するだけです。

<!-- secondPage.html.php -->
<script type="text/javascript">
    var exampleData = <?php echo $exampleData ?>;
    $('#hiddenInput').val(exampleData);
</script>

2 番目のコントローラー アクションは、セッションでシリアル化せずに $exampleData も受け取ります。

symfony2 をしばらく使用していないため、構文エラーがあれば申し訳ありません :)

于 2013-06-26T12:44:54.373 に答える