このエントリは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 にいきましょう