1

電子メールサブスクリプションの入力と送信を含むフッターテンプレートがあります。フッターはすべてのページで使用されます。サブスクリプションが成功すると、現在のページにリダイレクトされます。しかし、現在のページを示す文字列値を渡していることがわかりました。Play 2.0アプリケーション用のフッターテンプレートを作成するための最良の方法は何ですか?

footer.scala.html

@(page: String)
<div id="footer">
    <div class="input-append">
        <form action="@routes.ApplicationController.saveSubscription(page)"
                                method="post">
        <input type="text" name="emailAddress" placeholder="Your Email" />
        <input class="btn" type="submit" value="Subscribe" />
        </form>
    </div> <!-- /input-append -->  
</div> <!-- /footer -->

ApplicationController.java

public class ApplicationController extends Controller {
    public static Result saveSubscription(String page) {
        ..........
        flash("success", "success message");
        if (page.equals("page1")) {
            return redirect(routes.ApplicationController.page1());
        } else if (page.equals("page2")) {
            return redirect(routes.ApplicationController.page2());
        } 
    }
}

page1.scala.html

@main("Page 1") {
    <div>
    <p>page 1</p>
    </div>
    @footer("page1")
}

page2.scala.html

@main("Page 2") {
    <div>
    <p>page 2</p>
    </div>
    @footer("page2")
}

編集1

@virtualeyesをフォローしていますが、subscribe.jsが呼び出されていないようです。これが新しいセットアップです。

main.scala.html

<html>
    <head>
        <script type="text/javascript" src="@routes.Assets.at("javascripts/jquery.min.js")"></script>
    <script type="text/javascript" src="@routes.Assets.at("javascripts/vendor/jquery.validate.min.js")"></script>
    <script src="@routes.Assets.at("javascripts/main.js")" type="text/javascript"></script>
    <script src="@routes.Assets.at("javascripts/subscribe.js")" type="text/javascript"></script>

    </head>
    <body>
       @footer()
    </body>
</html>

footer.scala.html

<div id="footer">
    <div class="input-append">                  
      <form id="_form" action="@routes.ApplicationController.simpleSubscription()">
        <input type="text" name="emailAddress" placeholder="Your Email" />
        <input id="_process" class="btn" type="submit" value="Subscribe" />
      </form>
    </div> <!-- /input-append -->  
</div> <!-- /footer -->

ルート

POST    /subscribe  controllers.ApplicationController.simpleSubscription()

今、私は彼のエラーを受け取りました: アクションが見つかりませんリクエストに対して'GET /subscribe?emailAddress=fdsaf%40rte.com'

method="post"が削除されたためかどうかはわかりません。元に戻すと、結果は返されますが、/subscribeページにリダイレクトされます。subscribe.jsにもブレークポイントを設定しましたが、まったく呼び出されていないようです。

編集2-作業中

subscribe.coffeeに少し変更して、main.coffeeを削除した後、動作しています。

subscribe.coffee

$('#_process').click (e) ->
  e.preventDefault()

  isValid = $('#_form').validate().form()
  if isValid
    $('#_process').spin()
    $.ajax
      type: "POST"
      url:  $('#_form').attr('action')
      data: $('#_form').serialize()
      success: (data) ->
        $('#_status > div').removeClass('alert-error').addClass('alert-success')
        $('#_status > div').html( data )
        $('#_status').fadeIn()
        fade = () -> $('#_status').fadeOut('slow')
        setTimeout fade, 2000
        $('#_process').spin('stop')

      error: (data) ->
        $('#_status > div').removeClass('alert-success').addClass('alert-error')
        $('#_status > div').html( data.responseText )
        $('#_status').fadeIn()
        fade = () -> $('#_status').fadeOut('slow')
        setTimeout fade, 2000
        $('#_process').spin('stop')

      complete: () -> $('#_process').spin('stop')

footer.scala.html

 <div id="_status">
    <div class="alert alert-error"></div>
 </div>
 <div class="input-append">
    <form id="_form" action="@routes.ApplicationController.simpleSubscription">
       <input type="text" name="emailAddress" placeholder="Your Email" />
       <input id="_process" class="btn" type="submit" value="Subscribe" />
    </form>
    <div id="_spin"></div>
  </div> <!-- /input-append -->

spin()関数は https://github.com/pshizzle/spin.coffeeからのものです

4

2 に答える 2

2

AJAXはway™です

//footer.scala.html
<div id="footer">
  <div class="input-append">
    <form id="_form" action="@routes.ApplicationController.saveSubscription">
      <input type="text" name="emailAddress" placeholder="Your Email" />
      <input id="_process" class="btn" type="submit" value="Subscribe" />
      <img id="spinner" src="/assets/img/loader.gif" alt="loading..." />
    </form>
  </div>
</div>

<div id="status">
  <div class="alert alert-error"></div>
</div>
<style type="text/css">
  #spinner, #status { display: none; }
</style>

//ApplicationController.java
public class ApplicationController extends Controller {
  public static Result saveSubscription() {
    // save subscription
    ...
    // pseudo code
    if(success) 
      Ok( i18n("subscription success").toJson() );
    else
      Conflict( i18n("subscription fail").toJson() );
  }
}

//main.coffee
jQuery ->
  $.ajaxSetup
    type:     "POST"
    cache:    false
    dataType: "json"

  # prevent form submit on keypress
  $('form').find('input').keypress (e) -> e.preventDefault() if(e.which == 13)

  jParse = (data) -> 
    try jQuery.parseJSON(data)
    catch e
      data

  jText = (data) -> jParse(data.responseText)

  toSuccess = (msg) -> 
    $('#status > div').removeClass('alert-error').addClass('alert-success')
    $('#status > div').html( jParse(msg) )
    $('#status').fadeIn()

  toFail = (data) -> 
    $('#status > div').html( jText(data) )
    $('#status').fadeIn()

//subscribe.coffee
jQuery ->
  $('#_process').click (e) ->
    e.preventDefault()

    isValid = $('#_form').validate().form() // assumes jQuery validation plugin
    if isValid
      $('#spinner').show()
      $.ajax
        data: $('#_form').serialize()
        success: (msg) ->
          toSuccess(msg)
          fade = () -> $('#status').fadeOut('slow')
          setTimeout fade, 2000

        error: (data) -> toFail(data)

        complete: () -> $('#spinner').hide()
于 2012-08-21T20:05:39.703 に答える
0

隠しフィールドで使用できるリダイレクトアドレスを渡すのはどうですか?

footer

@(returnPath: String)
<form action="@routes.ApplicationController.saveSubscription()" method="post">
    ...
    <input type="hidden" name="returnPath" value="@returnPath" />
</form>

page1

@main("Page 1") {
    ...
    <!-- it's important to use toString at the end -->
    @footer(routes.ApplicationController.page1.toString)
}

pathまたはさらに良い:現在から与えるrequest()

@main("Page 1") {
    ...
    @footer(request.path)
}

controller

public static Result saveSubscription() {
    ...
    flash("success", "success message");
    return redirect(form().bindFromRequest().get("returnPath"));
}

ところで:AJAXフォームを使用する方が簡単でいいのではないでしょうか?このような場合、冗長なリロードをまったく回避します(オブジェクトを検索し、テンプレート全体を何度もレンダリングするなど)。

于 2012-08-21T19:17:17.700 に答える