Changeset 1857

Show
Ignore:
Timestamp:
04/11/08 04:33:15 (22 months ago)
Author:
bchoate
Message:

Optimizations for dashboard tag cloud for blogs with lotsa tags.

Location:
branches/release-34
Files:
3 modified

Legend:

Unmodified
Added
Removed
  • branches/release-34/lib/MT/App/CMS.pm

    r1852 r1857  
    308308        tag_cloud => { 
    309309            label    => 'Tag Cloud', 
     310            handler  => "${pkg}Dashboard::mt_blog_stats_tag_cloud_tab", 
    310311            template => 'widget/blog_stats_tag_cloud.tmpl', 
    311312        }, 
  • branches/release-34/lib/MT/CMS/Dashboard.pm

    r1738 r1857  
    379379} 
    380380 
     381sub mt_blog_stats_tag_cloud_tab { 
     382    my ($app, $tmpl, $param) = @_; 
     383 
     384    my $blog = $app->blog; 
     385    my $blog_id = $blog->id if $blog; 
     386 
     387    my $terms = {}; 
     388    $terms->{blog_id} = $blog_id if $blog_id; 
     389    $terms->{object_datasource} = 'entry'; 
     390    my $args = {}; 
     391    $args->{group} = [ 'tag_id' ]; 
     392    $args->{sort} = 'count(*)'; 
     393    $args->{direction} = 'descend'; 
     394    $args->{limit} = 100; 
     395 
     396    my $iter = MT::ObjectTag->count_group_by($terms, $args); 
     397    my @tag_loop; 
     398    my $ntags = 0; 
     399    my $min = undef; 
     400    my $max = undef; 
     401    while (my ($count, $tag_id) = $iter->()) { 
     402        my $tag = MT::Tag->load($tag_id) or next; 
     403        next if $tag->is_private; # weed these from the dashboard 
     404        $ntags += $count; 
     405        $min = defined $min ? ($count < $min ? $count : $min) : $count; 
     406        $max = defined $max ? ($count > $max ? $count : $max) : $count; 
     407        push @tag_loop, { name => $tag->name, count => $count }; 
     408    } 
     409 
     410    my $factor; 
     411    if ($max - $min == 0) { 
     412        $min -= 6; 
     413        $factor = 1; 
     414    } else { 
     415        $factor = 5 / log($max - $min + 1); 
     416    } 
     417    $factor *= ($ntags / 6) if $ntags < 6; 
     418 
     419    foreach my $tag (@tag_loop) { 
     420        # now calc rank 
     421        my $rank; 
     422        my $count = $tag->{count}; 
     423        if ($count - $min + 1 == 0) { 
     424            $rank = 0; 
     425        } else { 
     426            $rank = 6 - int(log($count - $min + 1) * $factor); 
     427        } 
     428        $tag->{rank} = $rank; 
     429    } 
     430 
     431    @tag_loop = sort { $a->{name} cmp $b->{name} } @tag_loop; 
     432    $param->{tag_loop} = \@tag_loop; 
     433} 
     434 
    381435sub mt_blog_stats_widget_comment_tab { 
    382436    my ($app, $tmpl, $param) = @_; 
  • branches/release-34/tmpl/cms/widget/blog_stats_tag_cloud.tmpl

    r1103 r1857  
    1 <mt:if name="blog_id"><mt:setvar name="blog_scope" value="$blog_id"><mt:else><mt:setvar name="blog_scope" value="all"></mt:if> 
    2 <mt:setvar name="tag_cloud" value="0"><MTTags blog_ids="$blog_scope" limit="1"><mt:setvar name="tag_cloud" value="1"></MTTags> 
    3 <mt:if name="tag_cloud"> 
     1<mt:if name="tag_loop"> 
    42    <mt:setvarblock name="tabs" append="1"> 
    53        <li id="tag-tab" class="tab <mt:if name="tab" eq="tag">selected-tab</mt:if>" mt:tab="tag" mt:command="select-tab" onclick="return blogStatsTabSelect('tag');"><a href="javascript:void(0);"><span><__trans phrase="Tags"></span></a></li> 
     
    97        <div id="tag-cloud"> 
    108            <ul id="tag-cloud-list"> 
    11             <MTTags blog_ids="$blog_scope" top="100" sort_by="name"> 
    12                 <li class="tag-<$MTTagRank$>"><a href="javascript:void(0)" onclick="recentEntriesForTag('<MTTagName escape="js">', 'tag-cloud-recent-entries'); return false"><$MTTagName$></a></li> 
    13             </MTTags> 
     9            <mt:loop name="tag_loop"> 
     10                <li class="tag-<$mt:var name="rank"$>"><a href="javascript:void(0)" onclick="recentEntriesForTag('<mt:var name="name" escape="js">', 'tag-cloud-recent-entries'); return false"><$mt:var name="name"$></a></li> 
     11            </mt:loop> 
    1412            </ul> 
    1513        </div>