2012-07-22 12 views
5

特定のフォームは複雑すぎて1ページに収まりません。たとえば、マップ上の場所を選択する、カレンダーウィジェットでイベントをスケジュールする、フォームの特定の部分を以前の入力に応じて変更するなど、フォームに大量の構造化データが含まれている場合は、複数のページにわたって特定のフォームを分割します。Yesod forms with page flow

これは動的ページとJavaScriptで簡単に行うことができます。別のページでタブウィジェットを作成するだけで、実際に送信されるフォームにはタブウィジェットとその入力フィールドがすべて含まれているため、POST操作全体の要求。

ただし、特定の入力フィールドを生成するのに時間がかかることがあります。たとえページが生成された後であってもローエンドのコンピュータユーザのブラウザに課税される場合でさえ、計算的に集中することさえあるかもしれない。さらに、以前の入力に基づいて自分自身に適応するフォームを作成することは困難または不可能になります。

したがって、複数のフルページリクエストにわたって特定のフォームを分割する必要があります。

これは特に、フォームの最初のページから、困難であることを証明することができますPOST/location/bへのリダイレクトとクライアントによってGETとして要求を発行します/location/a、へ。 POST /location/aからGET /location/bに格納されたフォームデータを渡すことは、困難がある場所です。

Spring Web Flowの作成者であるErwin Vervaet(主に依存性注入機能で知られているSpringフレームワークのサブプロジェクト)は、一度、a blog articleを書いて、実装したLift Web Frameworkと比較していますsimilar functionality。その後、彼は他のWebフレームワークに挑戦を提示します。これについては、a later articleで詳しく説明されています。

Yesododは、このステートレスなRESTベースの性質を考慮して、この問題にどのように直面しますか?

答えて

3

最初に、これには事前に構築された解決策はまだありません(少なくとも私はこれを知っています)。そして私は、言及された他のフレームワークがどのように問題を解決するかに精通していません。だから私がここで言うことは、かなり多くの推測です。しかし、私はそれがうまくいくと確信しています。

ここで重要な点は、ページAのPOSTパラメータをページBのGETリクエストにエンコードすることです。これを行う最も簡単な方法は、ページAのPOSTパラメータをセッション変数に固定することです。しかし、そのようにするとナビゲーションがかなり徹底的に中断されます。バック/フォワードは説明どおりに動作しません。

これでRESTに戻りました。POSTパラメータをリクエスト自体にエンコードする必要があります。つまり、要求されたパスまたはクエリ文字列のいずれかに情報を置くことを意味します。クエリ文字列がおそらく最も理にかなっています。

生のPOSTパラメータをクエリ文字列に入れることは、プロキシサーバーがコンテンツを簡単にスヌープできるようにするために心配です。ですから、私はクライアントからの既存の暗号を活用したいと思います。言い換えれば、以前のフォーム提出の署名された暗号化バージョンをクエリ文字列パラメータに貼り付けます。

は、もう少し具体的な作成するには:

  • ユーザーはGET経由して、ページAに行きます。
  • ユーザーはPOST経由でページAを送信します。
  • サーバーはフォームの送信を検証し、値を取得し、シリアル化し、暗号化/ハッシュします。
  • ユーザーは、ページAからの暗号化された/ハッシュ値を含むクエリ文字列パラメータを使用して、ページBにGETとしてリダイレクトされます。
  • このプロセスを必要な回数続けます。
  • 最後のページで、クエリ文字列パラメータを復号化し、すべてのフォーム送信を行うことができます。

これは、誰かが興味を持っていると書いてみると楽しいアドオンパッケージになるようです。

+1

この解決方法では、各ページに1つずつ、値をパックして展開したり、それらをディスパッチする(たとえば、ユーザーがページ2にいるとき、ページ1にアイテムを入力した場合、 HTMLベースのバックリンクを押すと、リンク 'GET/page1'は、**更新された**フォーム状態、好ましくは** sans Javascript-involvement **を含んでいなければなりません。明示的な 'AForm'コンストラクタがページとパラメータの解析を追跡している' yesod-form'パッケージと、いくつかの魔法の 'FormFooPage <#> R'がある場合、この解決策は"実現不可能 "と思われます。 – dflemstr

+1

もちろん、アイデアは非常に現実的なので、この実装は必要に応じてハンドリングしますが、フォームフィールドレンダリングを使用しても、Yesodは私を助けてくれません。 – dflemstr

+0

私は素敵な、ユーザーフレンドリーなAPIの作り方、内部の仕組みについては議論していませんでした。私たちは、高いレベルで、実行したい個々のフォームのタプルを提供することができると思っています.Yeodは自動的にブックキーピングを処理し、最終的に結果の組を提供します。それは間違いなく興味深い質問ですが、私はメーリングリストが600文字のコメントより詳細をハッシングする方が良いかもしれないと思っています:) –