このエントリはPlay frameworkひとりアドベントカレンダーの22日目です。
今日は画面左側の recent_sold
を実装します。
実装にさしあたりやることは次の2つ。
- テンプレートを使ってviewを整理
recent_sold
部分を実装
テンプレートを使う
呼び出される側は慣習の通り main.scala.html
としましょう。
→呼び出す側のviewから @main
で呼び出せるようになります。
@(recent_solds:List[HashMap[String,String]])(content:Html) <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>isucon 2</title> <link type="text/css" rel="stylesheet" href="https://netmark.jp/css/ui-lightness/jquery-ui-1.8.24.custom.css"> <link type="text/css" rel="stylesheet" href="https://netmark.jp/css/isucon2.css"> <script type="text/javascript" src="https://netmark.jp/js/jquery-1.8.2.min.js"></script> <script type="text/javascript" src="https://netmark.jp/js/jquery-ui-1.8.24.custom.min.js"></script> <script type="text/javascript" src="https://netmark.jp/js/isucon2.js"></script> </head> <body> <header> <a href="https://netmark.jp/"> <img src="https://netmark.jp/images/isucon_title.jpg"> </a> </header> <div id="sidebar"> @if(recent_solds != null){ <table> <tr><th colspan="2">最近購入されたチケット</th></tr> @for(recent_sold <- recent_solds){ <tr> <td class="recent_variation">@recent_sold("artistName") @recent_sold("ticketName") @recent_sold("variationName")</td> <td class="recent_seat_id">@recent_sold("seatId")</td> </tr> } </table> } </div> <div id="content"> @content </div> </body> </html>
recent_soldを実装
元コードはこちら
filter 'recent_sold' => sub { my ($app) = @_; sub { my ($self, $c) = @_; $c->stash->{recent_sold} = $self->dbh->select_all( 'SELECT stock.seat_id, variation.name AS v_name, ticket.name AS t_name, artist.name AS a_name FROM stock JOIN variation ON stock.variation_id = variation.id JOIN ticket ON variation.ticket_id = ticket.id JOIN artist ON ticket.artist_id = artist.id WHERE order_id IS NOT NULL ORDER BY order_id DESC LIMIT 10', ); $app->($self, $c); } };
クエリを実行してドンとするだけです。
playでfilterみたいなことができるような気はするのですが、よくわからないので地道に実装することにします。
だれか詳しい方がやりかたを教えてくれることを期待しましょう。
動けばいいんです。わかりやすいし。
public static List<HashMap> getRecentSolds() { List sqlRows = Ebean .createSqlQuery( "SELECT stock.seat_id, variation.name AS v_name, ticket.name AS t_name, artist.name AS a_name FROM stock" + " JOIN variation ON stock.variation_id = variation.id" + " JOIN ticket ON variation.ticket_id = ticket.id" + " JOIN artist ON ticket.artist_id = artist.id" + " WHERE order_id IS NOT NULL" + " ORDER BY order_id DESC LIMIT 10") .findList(); List<HashMap> recent_solds = new ArrayList<HashMap>( sqlRows.size()); for (SqlRow sqlRow : sqlRows) { HashMap recent_sold = new HashMap(); recent_sold.put("seatId", sqlRow.getString("seat_id")); recent_sold.put("variationName", sqlRow.getString("v_name")); recent_sold.put("ticketName", sqlRow.getString("t_name")); recent_sold.put("artistName", sqlRow.getString("a_name")); recent_solds.add(recent_sold); } return recent_solds; }
↑これを定義して、viewに渡してあげれば万事解決。
明日からは /admin
にいきましょう