2

Lift アプリケーションを作成しています。ページの 1 つは、Lift デモの「ファイル アップロード」の例に基づいています: http://demo.liftweb.net/file_upload

そのページのソース コードを見ると ... Lift の「snippet」タグが 2 つの「choose」タグを囲んでいることがわかります。

<lift:snippet type="misc:upload" form="post" multipart="true">

<choose:post>
<p>
File name: <ul:file_name></ul:file_name><br >
MIME Type: <ul:mime_type></ul:mime_type><br >
File length: <ul:length></ul:length><br >
MD5 Hash: <ul:md5></ul:md5><br >
</p>
</choose:post>

<choose:get>
Select a file to upload: <ul:file_upload></ul:file_upload><br >
<input type="submit" value="Upload File">
</choose:get>

</lift:snippet>

これは、ユーザーが初めてページにアクセスしたとき (つまり、GET 要求)、Lift がファイルをアップロードするためのフォームを表示するというものです。ユーザーがフォームを送信すると (つまり、同じページへの POST 要求)、Lift は代わりに処理中のファイルの結果を表示します。

私のアプリケーションでは、「結果」の POST ビューにフォームを含める必要があるという新しい問題があります。ユーザーが電子メールアドレスを入力するためのテキスト入力と、押されたときに処理されたファイルに関する情報を電子メールで送信する送信ボタンを提供したいと考えています。

...
<choose:post>
<p>
File name: <ul:file_name></ul:file_name><br >
MIME Type: <ul:mime_type></ul:mime_type><br >
File length: <ul:length></ul:length><br >
MD5 Hash: <ul:md5></ul:md5><br >
</p>

<!-- BEGIN NEW STUFF -->
Output: <br/>
<textarea rows="30" cols="100"><ul:output></ul:output></textarea>
<br/><br/>
Email the above output to this email address:<br/>
<ul:email/><br/>
<input type="submit" value="Email"/>
<!-- END NEW STUFF -->

</choose:post>
...

ただし、このページの GET バージョンと POST バージョンの両方が、Lift によって生成された同じフォームによってラップされており、どちらの場合も「アクション」が同じスニペットに設定されています。POST バージョンでフォームのアクションが別のスニペットに変更されるように、これを変更するにはどうすればよいですか?

典型的な Web フレームワークでは、「onclick」イベントと 2 つの基本的な JavaScript 行を使用して、このようなアプローチをとります。しかし、私はまだ Lift のことを理解していません... うーん、Scala で JavaScript を書くことについての興味深い概念です。多分私はその道をたどる必要があるか、あるいはもっと良いアプローチがあるかもしれません.

4

3 に答える 3

2

まず、カスタム XHTML タグの代わりに、Lift の新しい設計者向けの CSS バインディングを使用することをお勧めします。

Lift のスニペットを使用する際に覚えておくべきことの 1 つは、それが再帰的であることです。別のスニペットの HTML ブロック内に Lift スニペットを入れることができます。

たとえば、POST の後に別のフォームが必要な場合は、それをブロックに入れます。

<choose:post>
<p>
File name: <ul:file_name></ul:file_name><br >
MIME Type: <ul:mime_type></ul:mime_type><br >
File length: <ul:length></ul:length><br >
MD5 Hash: <ul:md5></ul:md5><br >
</p>
<!-- 
    The following is same as <lift:snippet type="EMailForm" form="post" multipart="true"> 
-->
<form action="" method="post" data-lift="EMailForm">
    <input type="text" name="email"/>
    <input type="submit" />
</form>
</choose:post>

次に、スニペット クラス EMailForm で電子メール フォーム アクションを処理します。

最後に、非表示のフォーム要素または SessionVar を使用して、ファイル名 / minetype およびその他の情報を渡すことができます。

于 2012-06-09T16:50:38.770 に答える
1

Brian に同意します。Lift の新しいデザイナー フレンドリーな CSS バインディングを使用します。

1 つはファイルのアップロード用、もう 1 つは電子メールの送信用です。S.seeOther を使用して、最初のフォームの処理が完了したら、ユーザーを 2 番目のフォームにリダイレクトします。

また、新しい「data-lift」HTML 属性も気に入っています。

ファイルのアップロード HTML:

<div data-lift="uploadSnippet?form=post">
    <input type="file" id="filename" />
    <input type="submit" id="submit" />
</div

ファイル アップロードのスニペット:

class uploadSnippet {
    def processUpload = {
        // do your processing
        ....
        if (success)
            S.seeOther("/getemail")

        // if processing fails, just allow this method to exit to re-render your 
        // file upload form
    }

    def render = {
        "#filename" #> SHtml.fileUpload(...) &
        "#submit" #> SHtml.submit("Upload", processUpload _ )
    }
}

GetEmail HTML:

<div data-lift="getEmailSnippet?form=post">
    <input type="text" id="email" />
    <input type="submit" id="submit" />
</div

メール スニペットを取得:

class getEmailSnippet {
    def processSubmit = {
       ....
    }

    def render = {
        "#email" #> SHtml.text(...) &
        "#submit" #> SHtml.submit("Upload", processSubmit _ )
    }

RequestVar の使用に関する私のブログ投稿で、フォーム処理についてもう少し詳しく説明しています: http://tech.damianhelme.com/understanding-lifts-requestvars

詳細が必要な場合はお知らせください。

それが役に立つことを願っています

乾杯

ダミアン

于 2012-06-10T10:40:00.710 に答える
0

今後数日以内に誰かがよりエレガントな (または「Lift-y」) アプローチを思いついた場合は、その回答を受け入れます。しかし、私は自分で回避策を考え出しました。

ビューにGETブロックとPOSTブロックの両方が同じスニペット関数に送信される現在のレイアウトを保持しました。スニペット関数にはまだif-elseブロックがあり、GET か POST かに応じて各リクエストを異なる方法で処理します。

ただし、 POST のブロックにセカンダリ ブロックもありif-elseます。このインナーは、クリックされた送信ボタンの名前を調べます。送信ボタンがファイルをアップロードするためのものであった場合、スニペットはファイルのアップロードと処理を処理します。それ以外の場合、それが最初の POST の後に表示されるメール送信送信ボタンであった場合、スニペットはメールの送信を処理します。if-else

特に魅力的ではありませんが、うまく機能します。

于 2012-06-08T20:22:33.053 に答える