Categories
open all | close allTags
カテゴリ | Flash | Migration | テスト | JustPosted | タグ | フォーム | 名称 | ドキュメント | Subversion | 国際化 | スキンエンジン | パソコン | デュアル・コア | Aptana | CSRF | RESTful | rubygems | 認証 | rakeSearch
ちょっと付け焼刃ですが一応TagCloud完成
スキンからは<%TagCloud(default/index,10)%>みたいな感じで呼び出します。パーサーでは
def parse_tagcloud params
blog = params[3] ? Blog.find_by_bname(params[3]) : @controller.blog
templatename = params[1]
template = Template.find_by_tdname(templatename)
bd = blog.basic_data
data = Hash.new
tempbuffer = fill(template['TAGLIST_HEADER'], bd)
tags = Category.tags(blog.id, params[2].to_i)
max = tags.first.count.to_i
min = tags.last.count.to_i
maxlevel = (params[4] || 4).to_i
if max == min
factor = 0.0
else
factor = (maxlevel - 1).to_f / (max - min)
end
tags.each do |tag|
data['level'] = Math.sqrt((tag.count.to_f - min) * factor).to_i + 1;
data['taglink'] = url_for(:controller=>'categories', :catid=>tag.catid, :action=>'show')
data['tagname'] = tag.cname
data['count'] = tag.count
tempbuffer += fill(template['TAGTLIST_LISTITEM'], bd.merge(data))
end
tempbuffer += fill(template['TAGLIST_FOOTER'], bd)
return tempbuffer
end
ここでCategory.tagsで指定した数だけタグをカウント順に取ってきます。この最大値と最小値から,比率を求めて大きさ(テンプレート中で<%level%>)を決めます。
Category.tagsの方が,苦労したところ。
def self.tags blogid, limit = nil
if limit
find(:all, :joins=>('LEFT JOIN '+TagCategory.table_name+' on catid=category_id'), \
:conditions=>['cblog = ? and caliasid is not null', blogid], \
:group=>'catid', :select=>'*, count(*) as count', :order=>'count DESC', \
:limit=>limit.to_i)
else
find(:all, :joins=>('LEFT JOIN '+TagCategory.table_name+' on catid=category_id'), \
:conditions=>['cblog = ? and caliasid is not null', blogid], \
:group=>'catid', :select=>'*, count(*) as count', :order=>'count DESC')
end
end数を限定する場合としない場合で分けてあります。これでSQL文一回呼び出すだけでカウントが取れます。
今の仕様だと,カウントが多い順にしか出力されないところがいまいちです。リストを取ってきた後ランダムに並べ替えるようなことができるといいのですが。
Comments
No comments yet. You can be the first!