root/branches/release-31/lib/MT/ArchiveType/CategoryWeekly.pm @ 1486

Revision 1486, 6.5 kB (checked in by bchoate, 21 months ago)

Refactoring of archive type publishing code into separate modules.

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