root/branches/release-39/lib/MT/ArchiveType/Weekly.pm @ 2500

Revision 2500, 3.8 kB (checked in by fumiakiy, 18 months ago)

Modernized how sort argument is specified in group_by query. BugId:79977. The legacy way of specifying it is still allowed but discouraged.

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::Weekly;
8
9use strict;
10use base qw( MT::ArchiveType::Date );
11use MT::Util qw( start_end_week week2ymd );
12
13sub name {
14    return 'Weekly';
15}
16
17sub archive_label {
18    return MT->translate("WEEKLY_ADV");
19}
20
21sub dynamic_template {
22    return 'archives/week/<$MTArchiveDate format="%Y%m%d"$>';
23}
24
25sub default_archive_templates {
26    return [
27        {
28            label    => MT->translate('yyyy/mm/day-week/index.html'),
29            template => '%y/%m/%d-week/%i',
30            default  => 1
31        },
32    ];
33}
34
35sub template_params {
36    return {
37        datebased_only_archive   => 1,
38        datebased_weekly_archive => 1,
39        archive_template         => 1,
40        archive_listing          => 1,
41        archive_class            => "datebased-weekly-archive",
42    };
43}
44
45sub archive_file {
46    my $obj = shift;
47    my ( $ctx, %param ) = @_;
48    my $timestamp = $param{Timestamp};
49    my $file_tmpl = $param{Template};
50
51    my $file;
52    if ($file_tmpl) {
53        ( $ctx->{current_timestamp}, $ctx->{current_timestamp_end} ) =
54          start_end_week($timestamp);
55    }
56    else {
57        my $start = start_end_week($timestamp);
58        my ( $year, $mon, $mday ) = unpack 'A4A2A2', $start;
59        $file = sprintf( "%04d/%02d/%02d-week/index", $year, $mon, $mday );
60    }
61    $file;
62}
63
64sub archive_title {
65    my $obj = shift;
66    my $stamp = ref $_[1] ? $_[1]->authored_on : $_[1];
67    my ( $start, $end ) = start_end_week( $stamp, $_[0]->stash('blog') );
68    MT::Template::Context::_hdlr_date( $_[0],
69        { ts => $start, 'format' => "%x" } )
70      . ' - '
71      . MT::Template::Context::_hdlr_date( $_[0],
72        { ts => $end, 'format' => "%x" } );
73}
74
75sub date_range {
76    my $obj = shift;
77    start_end_week(@_);
78}
79
80sub archive_group_iter {
81    my $obj = shift;
82    my ( $ctx, $args ) = @_;
83    my $blog = $ctx->stash('blog');
84    my $iter;
85    my $sort_order =
86      ( $args->{sort_order} || '' ) eq 'ascend' ? 'ascend' : 'descend';
87    my $order = ( $sort_order eq 'ascend' ) ? 'asc' : 'desc';
88
89    my $ts    = $ctx->{current_timestamp};
90    my $tsend = $ctx->{current_timestamp_end};
91
92    require MT::Entry;
93    $iter = MT::Entry->count_group_by(
94        {
95            blog_id => $blog->id,
96            status  => MT::Entry::RELEASE(),
97            ( $ts && $tsend ? ( authored_on => [ $ts, $tsend ] ) : () ),
98        },
99        {
100            ( $ts && $tsend ? ( range_incl => { authored_on => 1 } ) : () ),
101            group => [ "week_number" ],
102            $args->{lastn} ? ( limit => $args->{lastn} ) : (),
103            sort => [ { column => "week_number", desc => $order } ],
104        }
105    ) or return $ctx->error("Couldn't get weekly archive list");
106
107    return sub {
108        while ( my @row = $iter->() ) {
109            my $year = unpack 'A4', $row[1];
110            my $date =
111              sprintf( "%04d%02d%02d000000", week2ymd( $year, $row[1] ) );
112            my ( $start, $end ) = start_end_week($date);
113            return (
114                $row[0],
115                year  => $year,
116                week  => $row[1],
117                start => $start,
118                end   => $end
119            );
120        }
121        undef;
122    };
123}
124
125sub archive_group_entries {
126    my $obj = shift;
127    my ( $ctx, %param ) = @_;
128    my $ts =
129        $param{year}
130    ? sprintf( "%04d%02d%02d000000", week2ymd( $param{year}, $param{week} ) )
131        : undef;
132    my $limit = $param{limit};
133    $obj->dated_group_entries( $ctx, 'Weekly', $ts, $limit );
134}
135
136sub archive_entries_count {
137    my $obj = shift;
138    my ( $blog, $at, $entry ) = @_;
139    return $obj->SUPER::archive_entries_count(
140        {
141            Blog        => $blog,
142            ArchiveType => $at,
143            Timestamp   => $entry->authored_on
144        }
145    );
146}
147
1481;
Note: See TracBrowser for help on using the browser.