root/branches/release-38/lib/MT/ArchiveType/CategoryYearly.pm @ 2372

Revision 2372, 6.0 kB (checked in by bchoate, 19 months ago)

Updates to remap date_range method to appropriate class. BugId:79796

Line 
1# Movable Type (r) Open Source (C) 2001-2008 Six Apart, Ltd.
2# This program is distributed under the terms of the
3# GNU General Public License, version 2.
4#
5# $Id$
6
7package MT::ArchiveType::CategoryYearly;
8
9use strict;
10use base qw( MT::ArchiveType::Category MT::ArchiveType::Yearly );
11use MT::Util qw( dirify start_end_year );
12
13sub name {
14    return 'Category-Yearly';
15}
16
17sub archive_label {
18    return MT->translate('CATEGORY-YEARLY_ADV');
19}
20
21sub default_archive_templates {
22    return [
23        {
24            label    => 'category/sub-category/yyyy/index.html',
25            template => '%-c/%y/%i',
26            default  => 1
27        },
28        {
29            label    => 'category/sub_category/yyyy/index.html',
30            template => '%c/%y/%i'
31        },
32    ];
33}
34
35sub dynamic_template {
36    return 'category/<$MTCategoryID$>/<$MTArchiveDate format="%Y"$>';
37}
38
39sub template_params {
40    return {
41        archive_class           => "category-yearly-archive",
42        category_yearly_archive => 1,
43        archive_template        => 1,
44        archive_listing         => 1,
45    };
46}
47
48sub archive_file {
49    my $obj = shift;
50    my ( $ctx, %param ) = @_;
51    my $timestamp = $param{Timestamp};
52    my $file_tmpl = $param{Template};
53    my $blog      = $ctx->{__stash}{blog};
54    my $cat       = $ctx->{__stash}{cat} || $ctx->{__stash}{category};
55    my $entry     = $ctx->{__stash}{entry};
56    my $file;
57
58    my $this_cat = $cat ? $cat : ( $entry ? $entry->category : undef );
59    if ($file_tmpl) {
60        ( $ctx->{current_timestamp}, $ctx->{current_timestamp_end} ) =
61          start_end_year( $timestamp, $blog );
62        $ctx->stash( 'archive_category', $this_cat );
63        $ctx->{inside_mt_categories} = 1;
64        $ctx->{__stash}{category} = $this_cat;
65    }
66    else {
67        if ( !$this_cat ) {
68            return "";
69        }
70        my $label = '';
71        $label = dirify( $this_cat->label );
72        if ( $label !~ /\w/ ) {
73            $label = $this_cat ? "cat" . $this_cat->id : "";
74        }
75        my $start = start_end_year( $timestamp, $blog );
76        my ($year) = unpack 'A4', $start;
77        $file = sprintf( "%s/%04d/index", $this_cat->category_path, $year );
78    }
79    $file;
80}
81
82sub archive_title {
83    my $obj = shift;
84    my ( $ctx, $entry_or_ts ) = @_;
85    my $stamp = ref $entry_or_ts ? $entry_or_ts->authored_on : $entry_or_ts;
86    my $start = start_end_year( $stamp, $ctx->stash('blog') );
87    my $year =
88      MT::Template::Context::_hdlr_date( $ctx,
89        { ts => $start, 'format' => "%Y" } );
90    my $lang = lc MT->current_language || 'en_us';
91    $lang = 'ja' if lc($lang) eq 'jp';
92    my $cat = $obj->display_name($ctx);
93
94    sprintf( "%s%s%s", $cat, $year, ( $lang eq 'ja' ? '&#24180;' : '' ) );
95}
96
97sub archive_group_iter {
98    my $obj = shift;
99    my ( $ctx, $args ) = @_;
100    my $blog = $ctx->stash('blog');
101    my $sort_order =
102      ( $args->{sort_order} || '' ) eq 'ascend' ? 'ascend' : 'descend';
103    my $cat_order = $args->{sort_order} ? $args->{sort_order} : 'ascend';
104    my $order = ( $sort_order eq 'ascend' ) ? 'asc'                 : 'desc';
105    my $limit = exists $args->{lastn}       ? delete $args->{lastn} : undef;
106    my $tmpl  = $ctx->stash('template');
107    my $cat   = $ctx->stash('archive_category') || $ctx->stash('category');
108    my @data  = ();
109    my $count = 0;
110
111    require MT::Placement;
112    require MT::Entry;
113    my $loop_sub = sub {
114        my $c          = shift;
115        my $entry_iter = MT::Entry->count_group_by(
116            {
117                blog_id => $blog->id,
118                status  => MT::Entry::RELEASE()
119            },
120            {
121                group => ["extract(year from authored_on)"],
122                sort  => "extract(year from authored_on) $order",
123                'join' =>
124                  [ 'MT::Placement', 'entry_id', { category_id => $c->id } ]
125            }
126        ) or return $ctx->error("Couldn't get yearly archive list");
127        while ( my @row = $entry_iter->() ) {
128            my $hash = {
129                year     => $row[1],
130                category => $c,
131                count    => $row[0],
132            };
133            push( @data, $hash );
134            return $count + 1
135              if ( defined($limit) && ( $count + 1 ) == $limit );
136            $count++;
137        }
138    };
139
140    if ($cat) {
141        $loop_sub->($cat);
142    }
143    else {
144        require MT::Category;
145        my $iter = MT::Category->load_iter( { blog_id => $blog->id },
146            { 'sort' => 'label', direction => $cat_order } );
147        while ( my $category = $iter->() ) {
148            $loop_sub->($category);
149            last if ( defined($limit) && $count == $limit );
150        }
151    }
152
153    my $loop = @data;
154    my $curr = 0;
155
156    return sub {
157        if ( $curr < $loop ) {
158            my $date =
159              sprintf( "%04d%02d%02d000000", $data[$curr]->{year}, 1, 1 );
160            my ( $start, $end ) = start_end_year($date);
161            my $count = $data[$curr]->{count};
162            my %hash  = (
163                category => $data[$curr]->{category},
164                year     => $data[$curr]->{year},
165                start    => $start,
166                end      => $end,
167            );
168            $curr++;
169            return ( $count, %hash );
170        }
171        undef;
172      }
173}
174
175sub archive_group_entries {
176    my $obj = shift;
177    my ( $ctx, %param ) = @_;
178    my $ts =
179        $param{year}
180    ? sprintf( "%04d%02d%02d000000", $param{year}, 1, 1 )
181        : $ctx->stash('current_timestamp');
182    my $cat = $param{category} || $ctx->stash('archive_category');
183    my $limit = $param{limit};
184    $obj->dated_category_entries( $ctx, 'Category-Yearly', $cat, $ts, $limit );
185}
186
187sub archive_entries_count {
188    my $obj = shift;
189    my ( $blog, $at, $entry ) = @_;
190    my $cat = $entry->category;
191    return 0 unless $cat;
192    return $obj->SUPER::archive_entries_count(
193        {
194            Blog        => $blog,
195            ArchiveType => $at,
196            Timestamp   => $entry->authored_on,
197            Category    => $cat
198        }
199    );
200}
201
202sub date_range {
203    MT::ArchiveType::Yearly::date_range(@_);
204}
205
2061;
Note: See TracBrowser for help on using the browser.