/lib/MT/ArchiveType/ContentTypeAuthor.pm

https://github.com/usualoma/movabletype · Perl · 180 lines · 152 code · 23 blank · 5 comment · 13 complexity · 5d5704ebc03ba71d55c6764ffba9a5ad MD5 · raw file

  1. # Movable Type (r) (C) Six Apart Ltd. All Rights Reserved.
  2. # This code cannot be redistributed without permission from www.sixapart.com.
  3. # For more information, consult your Movable Type license.
  4. #
  5. # $Id$
  6. package MT::ArchiveType::ContentTypeAuthor;
  7. use strict;
  8. use warnings;
  9. use base qw( MT::ArchiveType::Author );
  10. use MT::ContentStatus;
  11. use MT::Util qw( remove_html encode_html );
  12. sub name {
  13. return 'ContentType-Author';
  14. }
  15. sub archive_label {
  16. return MT->translate("CONTENTTYPE-AUTHOR_ADV");
  17. }
  18. sub archive_short_label {
  19. return MT->translate("AUTHOR_ADV");
  20. }
  21. sub order {
  22. return 220;
  23. }
  24. sub dynamic_template {
  25. return 'author/<$MTContentAuthorID$>/<$MTContentID$>';
  26. }
  27. sub default_archive_templates {
  28. return [
  29. { label => 'author/author-basename/index.html',
  30. template => 'author/%-a/%f',
  31. default => 1
  32. },
  33. { label => 'author/author_basename/index.html',
  34. template => 'author/%a/%f'
  35. },
  36. ];
  37. }
  38. sub template_params {
  39. return {
  40. archive_class => "contenttype-author-archive",
  41. author_archive => 1,
  42. archive_template => 1,
  43. archive_listing => 1,
  44. author_based_archive => 1,
  45. contenttype_archive_listing => 1,
  46. };
  47. }
  48. sub archive_group_iter {
  49. my $obj = shift;
  50. my ( $ctx, $args ) = @_;
  51. my $blog = $ctx->stash('blog');
  52. my $sort_order
  53. = ( $args->{sort_order} || '' ) eq 'ascend' ? 'ascend' : 'descend';
  54. my $auth_order = $args->{sort_order} ? $args->{sort_order} : 'ascend';
  55. my $order = ( $sort_order eq 'ascend' ) ? 'asc' : 'desc';
  56. my $limit = exists $args->{lastn} ? delete $args->{lastn} : undef;
  57. require MT::ContentData;
  58. require MT::Author;
  59. my $auth_iter = MT::Author->load_iter(
  60. undef,
  61. { sort => 'name',
  62. direction => $auth_order,
  63. join => [
  64. 'MT::ContentData',
  65. 'author_id',
  66. { status => MT::ContentStatus::RELEASE(),
  67. blog_id => $blog->id
  68. },
  69. { unique => 1 }
  70. ]
  71. }
  72. );
  73. my $i = 0;
  74. return sub {
  75. while ( my $a = $auth_iter->() ) {
  76. last if defined($limit) && $i == $limit;
  77. my $count = MT::ContentData->count(
  78. { blog_id => $blog->id,
  79. status => MT::ContentStatus::RELEASE(),
  80. author_id => $a->id,
  81. ( $ctx->stash('content_type')
  82. ? ( content_type_id =>
  83. $ctx->stash('content_type')->id )
  84. : ()
  85. ),
  86. }
  87. );
  88. next if $count == 0 && !$args->{show_empty};
  89. $i++;
  90. return ( $count, author => $a );
  91. }
  92. undef;
  93. };
  94. }
  95. sub archive_contents_count {
  96. my $obj = shift;
  97. my ( $blog, $at, $content_data ) = @_;
  98. return $obj->SUPER::archive_contents_count(
  99. { Blog => $blog,
  100. ArchiveType => $at,
  101. }
  102. ) unless $content_data;
  103. my $auth = $content_data->author;
  104. return $obj->SUPER::archive_contents_count(
  105. { Blog => $blog,
  106. ArchiveType => $at,
  107. Author => $auth,
  108. ContentData => $content_data,
  109. }
  110. );
  111. }
  112. sub archive_group_contents {
  113. my $obj = shift;
  114. my ( $ctx, $param, $content_type_id ) = @_;
  115. $content_type_id ||=
  116. $ctx->stash('content_type') ? $ctx->stash('content_type')->id
  117. : $ctx->stash('template') ? $ctx->stash('template')->content_type_id
  118. : undef;
  119. my $blog = $ctx->stash('blog');
  120. my $a = $param->{author} || $ctx->stash('author');
  121. my $limit = $param->{limit};
  122. $limit = 0 if defined $limit && $limit eq 'none';
  123. return [] unless $a;
  124. require MT::ContentData;
  125. my @contents = MT::ContentData->load(
  126. { blog_id => $blog->id,
  127. ( $content_type_id
  128. ? ( content_type_id => $content_type_id )
  129. : ()
  130. ),
  131. author_id => $a->id,
  132. status => MT::ContentStatus::RELEASE()
  133. },
  134. { 'sort' => 'authored_on',
  135. 'direction' => 'descend',
  136. ( $limit ? ( 'limit' => $limit ) : () ),
  137. }
  138. );
  139. \@contents;
  140. }
  141. sub does_publish_file {
  142. my $obj = shift;
  143. my %params = %{ shift() };
  144. if ( !$params{Author} && $params{ContentData} ) {
  145. $params{Author} = $params{ContentData}->author;
  146. }
  147. return 0 unless $params{Author};
  148. MT::ArchiveType::archive_contents_count( $obj, \%params );
  149. }
  150. sub get_content {
  151. my ( $archiver, $ctx ) = @_;
  152. return $ctx->{__stash}{content};
  153. }
  154. sub contenttype_group_based {
  155. return 1;
  156. }
  157. 1;