root/branches/release-33/lib/MT/ArchiveType/CategoryMonthly.pm @ 1741

Revision 1741, 6.5 kB (checked in by bsmith, 20 months ago)

bugzid:75115 - remove 'main_template' variable

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::CategoryMonthly;
8
9use strict;
10use base qw( MT::ArchiveType::Category MT::ArchiveType::Monthly );
11use MT::Util qw( dirify start_end_month );
12
13sub name {
14    return 'Category-Monthly';
15}
16
17sub archive_label {
18    return MT->translate('CATEGORY-MONTHLY_ADV');
19}
20
21sub default_archive_templates {
22    return [
23        {
24            label    => 'category/sub-category/yyyy/mm/index.html',
25            template => '%-c/%y/%m/%i',
26            default  => 1
27        },
28        {
29            label    => 'category/sub_category/yyyy/mm/index.html',
30            template => '%c/%y/%m/%i'
31        },
32    ];
33}
34
35sub dynamic_template {
36    return 'category/<$MTCategoryID$>/<$MTArchiveDate format="%Y%m"$>';
37}
38
39sub template_params {
40    return {
41        archive_class            => "category-monthly-archive",
42        category_monthly_archive => 1,
43        'module_category-monthly_archives' => 1,
44        archive_template                   => 1,
45        archive_listing                    => 1,
46    };
47}
48
49sub archive_file {
50    my $obj = shift;
51    my ( $ctx, %param ) = @_;
52    my $timestamp = $param{Timestamp};
53    my $file_tmpl = $param{Template};
54    my $blog      = $ctx->{__stash}{blog};
55    my $cat       = $ctx->{__stash}{cat} || $ctx->{__stash}{category};
56    my $entry     = $ctx->{__stash}{entry};
57    my $file;
58
59    my $this_cat = $cat ? $cat : ( $entry ? $entry->category : undef );
60    if ($file_tmpl) {
61        ( $ctx->{current_timestamp}, $ctx->{current_timestamp_end} ) =
62          start_end_month( $timestamp, $blog );
63        $ctx->stash( 'archive_category', $this_cat );
64        $ctx->{inside_mt_categories} = 1;
65        $ctx->{__stash}{category} = $this_cat;
66    }
67    else {
68        if ( !$this_cat ) {
69            return "";
70        }
71        my $label = '';
72        $label = dirify( $this_cat->label );
73        if ( $label !~ /\w/ ) {
74            $label = $this_cat ? "cat" . $this_cat->id : "";
75        }
76        my $start = start_end_month( $timestamp, $blog );
77        my ( $year, $month ) = unpack 'A4A2', $start;
78        $file = sprintf( "%s/%04d/%02d/index",
79            $this_cat->category_path, $year, $month );
80    }
81    $file;
82}
83
84sub archive_title {
85    my $obj = shift;
86    my ( $ctx, $entry_or_ts ) = @_;
87    my $stamp = ref $entry_or_ts ? $entry_or_ts->authored_on : $entry_or_ts;
88    my $start = start_end_month( $stamp, $ctx->stash('blog') );
89    my $date =
90      MT::Template::Context::_hdlr_date( $ctx,
91        { ts => $start, 'format' => "%B %Y" } );
92    my $cat = $obj->display_name($ctx);
93
94    sprintf( "%s%s", $cat, $date );
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    my $ts    = $ctx->{current_timestamp};
111    my $tsend = $ctx->{current_timestamp_end};
112
113    require MT::Placement;
114    require MT::Entry;
115    my $loop_sub = sub {
116        my $c          = shift;
117        my $entry_iter = MT::Entry->count_group_by(
118            {
119                blog_id => $blog->id,
120                status  => MT::Entry::RELEASE(),
121                ( $ts && $tsend ? ( authored_on => [ $ts, $tsend ] ) : () ),
122            },
123            {
124                ( $ts && $tsend ? ( range_incl => { authored_on => 1 } ) : () ),
125                group => [
126                    "extract(year from authored_on)",
127                    "extract(month from authored_on)"
128                ],
129                sort => "extract(year from authored_on) $order,
130                              extract(month from authored_on) $order",
131                'join' =>
132                  [ 'MT::Placement', 'entry_id', { category_id => $c->id } ]
133            }
134        ) or return $ctx->error("Couldn't get yearly archive list");
135        while ( my @row = $entry_iter->() ) {
136            my $hash = {
137                year     => $row[1],
138                month    => $row[2],
139                category => $c,
140                count    => $row[0],
141            };
142            push( @data, $hash );
143            return $count + 1
144              if ( defined($limit) && ( $count + 1 ) == $limit );
145            $count++;
146        }
147    };
148
149    if ($cat) {
150        $loop_sub->($cat);
151    }
152    else {
153        require MT::Category;
154        my $iter = MT::Category->load_iter( { blog_id => $blog->id },
155            { 'sort' => 'label', direction => $cat_order } );
156        while ( my $category = $iter->() ) {
157            $loop_sub->($category);
158            last if ( defined($limit) && $count == $limit );
159        }
160    }
161
162    my $loop = @data;
163    my $curr = 0;
164
165    return sub {
166        if ( $curr < $loop ) {
167            my $date = sprintf(
168                "%04d%02d%02d000000",
169                $data[$curr]->{year},
170                $data[$curr]->{month}, 1
171            );
172            my ( $start, $end ) = start_end_month($date);
173            my $count = $data[$curr]->{count};
174            my %hash  = (
175                category => $data[$curr]->{category},
176                year     => $data[$curr]->{year},
177                month    => $data[$curr]->{month},
178                start    => $start,
179                end      => $end,
180            );
181            $curr++;
182            return ( $count, %hash );
183        }
184        undef;
185      }
186}
187
188sub archive_group_entries {
189    my $obj = shift;
190    my ( $ctx, %param ) = @_;
191    my $ts =
192        $param{year}
193    ? sprintf( "%04d%02d%02d000000", $param{year}, $param{month}, 1 )
194        : $ctx->stash('current_timestamp');
195    my $cat = $param{category} || $ctx->stash('archive_category');
196    my $limit = $param{limit};
197    $obj->dated_category_entries( $ctx, 'Category-Monthly', $cat, $ts, $limit );
198}
199
200sub archive_entries_count {
201    my $obj = shift;
202    my ( $blog, $at, $entry ) = @_;
203    my $cat = $entry->category;
204    return 0 unless $cat;
205    return $obj->SUPER::archive_entries_count(
206        {
207            Blog        => $blog,
208            ArchiveType => $at,
209            Timestamp   => $entry->authored_on,
210            Category    => $cat
211        }
212    );
213}
214
2151;
Note: See TracBrowser for help on using the browser.