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.
7
package MT::ArchiveType::CategoryDaily;
10
use base qw( MT::ArchiveType::Category MT::ArchiveType::Daily );
11
use MT::Util qw( dirify start_end_day );
14
return 'Category-Daily';
18
return MT->translate('CATEGORY-DAILY_ADV');
21
sub default_archive_templates {
24
label => 'category/sub-category/yyyy/mm/dd/index.html',
25
template => '%-c/%y/%m/%d/%i',
29
label => 'category/sub_category/yyyy/mm/dd/index.html',
30
template => '%c/%y/%m/%d/%i'
35
sub dynamic_template {
36
return 'category/<$MTCategoryID$>/<$MTArchiveDate format="%Y%m%d"$>';
41
archive_class => "category-daily-archive",
42
category_daily_archive => 1,
43
archive_template => 1,
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};
58
my $this_cat = $cat ? $cat : ( $entry ? $entry->category : undef );
60
( $ctx->{current_timestamp}, $ctx->{current_timestamp_end} ) =
61
start_end_day( $timestamp, $blog );
62
$ctx->stash( 'archive_category', $this_cat );
63
$ctx->{inside_mt_categories} = 1;
64
$ctx->{__stash}{category} = $this_cat;
71
$label = dirify( $this_cat->label );
72
if ( $label !~ /\w/ ) {
73
$label = $this_cat ? "cat" . $this_cat->id : "";
75
my $start = start_end_day( $timestamp, $blog );
76
my ( $year, $month, $day ) = unpack 'A4A2A2', $start;
77
$file = sprintf( "%s/%04d/%02d/%02d/index",
78
$this_cat->category_path, $year, $month, $day );
85
my ( $ctx, $entry_or_ts ) = @_;
86
my $stamp = ref $entry_or_ts ? $entry_or_ts->authored_on : $entry_or_ts;
87
my $start = start_end_day( $stamp, $ctx->stash('blog') );
89
MT::Template::Context::_hdlr_date( $ctx,
90
{ ts => $start, 'format' => "%x" } );
91
my $cat = $obj->display_name($ctx);
93
sprintf( "%s%s", $cat, $date );
96
sub archive_group_iter {
98
my ( $ctx, $args ) = @_;
99
my $blog = $ctx->stash('blog');
101
( $args->{sort_order} || '' ) eq 'ascend' ? 'ascend' : 'descend';
102
my $cat_order = $args->{sort_order} ? $args->{sort_order} : 'ascend';
103
my $order = ( $sort_order eq 'ascend' ) ? 'asc' : 'desc';
104
my $limit = exists $args->{lastn} ? delete $args->{lastn} : undef;
105
my $tmpl = $ctx->stash('template');
106
my $cat = $ctx->stash('archive_category') || $ctx->stash('category');
109
my $ts = $ctx->{current_timestamp};
110
my $tsend = $ctx->{current_timestamp_end};
112
require MT::Placement;
116
my $entry_iter = MT::Entry->count_group_by(
118
blog_id => $blog->id,
119
status => MT::Entry::RELEASE(),
120
( $ts && $tsend ? ( authored_on => [ $ts, $tsend ] ) : () ),
123
( $ts && $tsend ? ( range_incl => { authored_on => 1 } ) : () ),
125
"extract(year from authored_on)",
126
"extract(month from authored_on)",
127
"extract(day from authored_on)"
130
{ column => "extract(year from authored_on)", desc => $order },
131
{ column => "extract(month from authored_on)", desc => $order },
132
{ column => "extract(day from authored_on)", desc => $order },
135
[ 'MT::Placement', 'entry_id', { category_id => $c->id } ]
137
) or return $ctx->error("Couldn't get yearly archive list");
138
while ( my @row = $entry_iter->() ) {
146
push( @data, $hash );
148
if ( defined($limit) && ( $count + 1 ) == $limit );
157
require MT::Category;
158
my $iter = MT::Category->load_iter( { blog_id => $blog->id },
159
{ 'sort' => 'label', direction => $cat_order } );
160
while ( my $category = $iter->() ) {
161
$loop_sub->($category);
162
last if ( defined($limit) && $count == $limit );
170
if ( $curr < $loop ) {
172
"%04d%02d%02d000000",
173
$data[$curr]->{year},
174
$data[$curr]->{month},
177
my ( $start, $end ) = start_end_day($date);
178
my $count = $data[$curr]->{count};
180
category => $data[$curr]->{category},
181
year => $data[$curr]->{year},
182
month => $data[$curr]->{month},
183
day => $data[$curr]->{day},
188
return ( $count, %hash );
194
sub archive_group_entries {
196
my ( $ctx, %param ) = @_;
199
? sprintf( "%04d%02d%02d000000", $param{year}, $param{month},
201
: $ctx->stash('current_timestamp');
202
my $cat = $param{category} || $ctx->stash('archive_category');
203
my $limit = $param{limit};
204
$obj->dated_category_entries( $ctx, 'Category-Daily', $cat, $ts, $limit );
207
sub archive_entries_count {
209
my ( $blog, $at, $entry ) = @_;
210
my $cat = $entry->category;
211
return 0 unless $cat;
212
return $obj->SUPER::archive_entries_count(
216
Timestamp => $entry->authored_on,
222
*date_range = \&MT::ArchiveType::Daily::date_range;
223
*next_archive_entry = \&MT::ArchiveType::Date::next_archive_entry;
224
*previous_archive_entry = \&MT::ArchiveType::Date::previous_archive_entry;