ちょっと付け焼刃ですが一応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文一回呼び出すだけでカウントが取れます。

今の仕様だと,カウントが多い順にしか出力されないところがいまいちです。リストを取ってきた後ランダムに並べ替えるようなことができるといいのですが。


01 Jun, 2008 | Foodyn | | Andy
« Prev item - Next Item »
---------------------------------------------

Comments


No comments yet. You can be the first!


Leave comment

© 2007 yoursite.com | Designed by DesignsByDarren
Ported to Nucleus CMS: Suvoroff