2

Play 2.0.3 にいくつかのフロー制御を実装しようとしています。これは、いくつかのステップを持つウィザードのようなものです。Playでそれを行う最良の方法は何ですか?

step1→step2→finishのように多段フローにしたい

主な問題は、ユーザーがたとえばステップ 2 をスキップして、直接終了に進むことを許可しないことです (ユーザーはブラウザー/finishに手動でリンクを入力できます)。

ありがとう。うまく説明できていない場合はお知らせください。

4

3 に答える 3

4

少なくとも 2 つのオプションがあります。

  • ステップ間でデータを送信するために POST メソッドを使用します。これは常に同じ URL を使用し、ユーザーがページを更新すると最初のステップに戻ります。ステップ識別子は非表示のフォーム フィールドになります。
  • 次のステップを表示するために jQuery を使用します。ステップ間でサーバーにデータを送信する必要さえありません。1 つの大きなフォーム (フォームの場合) を作成し、その部分を jQuery で表示/非表示にすることができます。最後に、すべてのステップを内部で実行して一般的なフォームの送信を実行し、そこで検証して「ありがとう」ページを表示できます。
  • 必要に応じて、jQuery で AJAX を使用して、検証と保存の手順を分離できます。
于 2012-11-07T14:27:33.950 に答える
2

完全にステートレスな方法は、ステップのURLにすべてのデータを格納することで構成できます。ここで、ステップにはステップn + 1からのすべてのデータが含まれますn

GET   /step1    controllers.Application.step1
GET   /step2    controllers.Application.step2(dataFromStep1)
GET   /step3    controllers.Application.step3(dataFromStep1, dataFromStep2)
POST  /finish   controllers.Application.finish

このソリューションの利点は、その単純さと、次のステップがPlayによって無料で実行される前に、必要なすべてのステップが完了していることを確認できることです。ルーター。

ただし、大量のデータがある場合、URLは膨大になるため、このソリューションの適用性は低くなります。このような場合、次のことを行う必要があります。

  • 各ステップのデータを永続ストレージに保存します(セッションを使用することも別のオプションですが、サイズは4KBに制限されています)。
  • ユーザーを特定して、たとえば/step2URLが異なるユーザーに対して同じものを返さないようにします。
  • タイムアウトを設定して、不完全な送信を破棄し、永続ストレージをクリーンアップします。
  • 最終的な提出のためにすべてのステップが完了したことをビジネスコードで手動でチェックインします。
于 2012-11-07T20:55:35.143 に答える
1

ステップをデータベース(長期)またはキャッシュ(短期)に保存します。このようにして、ロジックを構築if (secondQuestionAnswered) { .. }し、ユーザーが何もスキップしていないこと、および/またはユーザーが必要なときに手順を完了できることを確認できます。また、アプリが大きくなり、スケーリングする必要がある場合は、DBまたはキャッシュに保持することもメリットがあります。

于 2012-11-07T20:56:48.280 に答える