Scala

playframework2のテンプレート内で繰り返し

前回からの続きです。
Twitterから取得したタイムラインを表示する部分を作成します。
取得したタイムラインを繰り返し表示する必要があります。
というわけで、今回はPlayframework2のテンプレート内で繰り返しなどの制御をしてみたいと思います。

Twitter用のオブジェクトを作成

基本的に、Twitter4jのオブジェクトを使いますが、集約するためのオブジェクトを作ります。
twitterパッケージを作成して、TwitterInfoというクラスを作成しました。
取り急ぎ、以下のようなクラスを作成します。

[java]
package twitter;

public class TwitterInfo {
public String screen_name;
public String description;
public List<Tweet> tweets;
}
[/java]

もう一つ、ツイート情報を保持するクラスを作成します。

[java]
public class Tweet {
public String text;
}
[/java]

とりあえず、今はこれで。後から色々追加するかもしれません。

Playframework2のテンプレートの引数を変更

これが、ハマりました。
scalaのインポート方法調べて、書いたんですけど、認識してくれなくて・・・。

[scala]
@(twitter_info: TwitterInfo)
@import twitter._
[/scala]

使っているオブジェクトの後にインポート文があるので、ダメなんでしょうけど。インポート文を上に持っていてもダメだったので、諦めました。後ほど、要調査。
project/Build.scalaというファイルがあるので、こちらにインポート文を記載しました。

[scala]
val main = play.Project(appName, appVersion, appDependencies).settings(
// Add your own project settings here
templatesImport += "twitter._"
)
[/scala]

これで、無事にコンパイルできるようになりました。

Application.javaの修正

これで、要約Application.javaの修正を行えます・・・。
timelineメソッドを修正します。

とりあえず確認が目的なので、Twitterからデータを取得せずに、自作自演します。

[java]
public static Result timeline() {
TwitterInfo ti = new TwitterInfo();
ti.screen_name = "テスト(名前)";
ti.description = "テスト(概要)";

List<Tweet> tweets = new ArrayList<Tweet>();
tweets.add(createTweet("1ツイート"));
tweets.add(createTweet("2ツイート"));
tweets.add(createTweet("3ツイート"));
tweets.add(createTweet("4ツイート"));
ti.tweets = tweets;

return ok(timeline.render(ti));
}

private static Tweet createTweet(String text) {
Tweet tweet = new Tweet();
tweet.text = text;

return tweet;
}
[/java]

timeline.scala.htmlの修正

お待たせしました。これでようやく本記事のメインのテンプレート内での繰り返しが行えます。長かった・・・。

繰り返しの書き方は単純で、@for(){}です。まぁ、
ちなみに、この中で分岐とかできるのかな。また今度調べてみます。

[html]
@(twitter_info: TwitterInfo)
@main("Welcome to Play 2.1") {
<!-- Main hero unit for a primary marketing message or call to action -->
<div class="hero-unit">
<h1>@twitter_info.screen_name</h1>
<p>@twitter_info.description</p>
<p><a href="#" class="btn btn-primary btn-large">Learn more &raquo;</a></p>
</div>
<!-- Example row of columns -->
<div class="row">
@for(tweet <- twitter_info.tweets) {
<div class="span4">
<p>@tweet.text</p>
<p><a class="btn" href="#">View details &raquo;</a></p>
</div>
}
</div>
}
[/html]

実行してみる

Welcome to Play 2.1-4
Application.javaに書いた内容が表示されています。

表示させている内容が単純なので、なんとも言えないですが、とりあえずインポートの部分でかなり時間を割いてしまいました。
多分ですが、引数で使用するクラスはグローバルでインポートして、テンプレート内部で使用するクラスは、テンプレート内でインポートで大丈夫じゃないかなーと、勝手に思っています。

-Scala
-

© 2025 ビー鉄のブログ Powered by AFFINGER5