Jewel-mmo開発日記

RubyでMMORPGを作る過程を記録する日記。 Yokohama.rb 発起人。
2006-03-21

[tDiary]特定のカテゴリの記事だけを

並べて表示することってできないのかな? ちょっと調べてみよう。

__

CVSから最新版をとってきたい。これで取得できた。

cvs -d:pserver:anonymous@cvs.sourceforge.net/cvsroot/tdiary login
cvs -d:pserver:anonymous@cvs.sourceforge.net/cvsroot/tdiary co core

__

うお、タブだ!

あれ、カテゴリって純粋なプラグインじゃないんだ。 index.rb でこんな場合分けがされている。

elsif @cgi.valid?( 'category' )
  tdiary = TDiary::TDiaryCategoryView::new( @cgi, "category.rhtml", conf )

__

なるほど、こういうことか。tdiary.rb の中で cgi#valid? が定義されている。

def valid?( param, idx = 0 )
  begin
    self.params[param] and self.params[param][idx] and self.params[param][idx].length > 0
  rescue NameError # for Tempfile class of ruby 1.6
    self.params[param][idx].stat.size > 0
  end
end

この valid? 使って最初の挙動を場合分けする。

if @cgi.valid?( 'comment' ) then
  tdiary = TDiary::TDiaryComment::new( @cgi, "day.rhtml", conf )
elsif @cgi.valid?( 'date' )
  (省略)
elsif @cgi.valid?( 'category' )
  tdiary = TDiary::TDiaryCategoryView::new( @cgi, "category.rhtml", conf )
else
  tdiary = TDiary::TDiaryLatest::new( @cgi, "latest.rhtml", conf )
end

ぱっと見それぞれはこんな挙動だと予想できる。

  • comment …… コメントの書き込み
  • date …… 記事表示
  • category …… カテゴリ表示
  • それ以外 …… 最近の記事表示

date モードは渡された値によってさらに場合分けされている。

date = @cgi.params['date'][0]
if /^\d{8}-\d+$/ =~ date then
  tdiary = TDiary::TDiaryLatest::new( @cgi, "latest.rhtml", conf )
elsif /^\d{8}$/ =~ date
  tdiary = TDiary::TDiaryDay::new( @cgi, "day.rhtml", conf )
elsif /^\d{6}$/ =~ date then
  tdiary = TDiary::TDiaryMonth::new( @cgi, "month.rhtml", conf )
elsif /^\d{4}$/ =~ date then
  tdiary = TDiary::TDiaryNYear::new( @cgi, "month.rhtml", conf )
end

date モードのときに記事の形式パタンを定義したクラスを呼び出すようだ。

TDiaryLatest, TDiaryDay , TDiaryMonth, TDiaryNYearというクラスがあるから、これらのクラスの中で記事を抽出しているものと思われる。こういったクラスを作らずに、記事の検索条件をパラメータとして与えて表示する記事をセレクトしたり、並べ替えたりできるインターフェースがあるとといい気がするけどどうだろう、という思いを抱きつつこれらの中身を見てみよう。

__

ますは TDiaryLatest を読んでみる。

かなり長い……。挫折した。