| 1 |
# EntryCategoriesFiltered plugin for Movable Type |
|---|
| 2 |
# Author: Jay Allen, Six Apart (http://www.sixapart.com) |
|---|
| 3 |
# Released under the Artistic License |
|---|
| 4 |
# |
|---|
| 5 |
# $Id$ |
|---|
| 6 |
|
|---|
| 7 |
# MTEntryCategoriesFiltered |
|---|
| 8 |
# MTEntryCategories... But filtered |
|---|
| 9 |
#------------------------------------------------------------ |
|---|
| 10 |
# |
|---|
| 11 |
# <MTEntryCategoriesFiltered exclude_regex="T.*" exclude_branch="Top" glue=","> |
|---|
| 12 |
# <$MTCategoryLabel$> |
|---|
| 13 |
# </MTEntryCategoriesFiltered></p> |
|---|
| 14 |
# |
|---|
| 15 |
# exclude_regex - Allows you to exclude by regex match on the Label |
|---|
| 16 |
# exclude_branch - Allows you to exclude a branch of a subcategory |
|---|
| 17 |
# hierarchy by the parent's label. |
|---|
| 18 |
# |
|---|
| 19 |
# |
|---|
| 20 |
package MT::Plugin::entrycatsfilter; |
|---|
| 21 |
|
|---|
| 22 |
use strict; |
|---|
| 23 |
use vars qw($VERSION $plugin); |
|---|
| 24 |
|
|---|
| 25 |
use MT 3.2; |
|---|
| 26 |
@MT::Plugin::entrycatsfilter::ISA = ('MT::Plugin'); |
|---|
| 27 |
use base 'MT::Plugin'; |
|---|
| 28 |
|
|---|
| 29 |
|
|---|
| 30 |
$VERSION = '1.0'; |
|---|
| 31 |
$plugin = new MT::Plugin::entrycatsfilter({ |
|---|
| 32 |
name => 'Filtered entry categories', |
|---|
| 33 |
version => $VERSION, |
|---|
| 34 |
description => '<MT_TRANS phrase="This plugin provides the a tag through which you can filter your entry categories listing.">', |
|---|
| 35 |
author_name => 'Jay Allen', |
|---|
| 36 |
author_link => 'http://www.jayallen.org' |
|---|
| 37 |
}); |
|---|
| 38 |
|
|---|
| 39 |
|
|---|
| 40 |
MT->add_plugin($plugin); |
|---|
| 41 |
|
|---|
| 42 |
require MT::Template::Context; |
|---|
| 43 |
MT::Template::Context->add_container_tag('EntryCategoriesFiltered', |
|---|
| 44 |
sub { _hdlr_entry_categories_filtered(@_); }); |
|---|
| 45 |
|
|---|
| 46 |
sub _hdlr_entry_categories_filtered { |
|---|
| 47 |
my($ctx, $args, $cond) = @_; |
|---|
| 48 |
|
|---|
| 49 |
my $e = $ctx->stash('entry') |
|---|
| 50 |
or return $ctx->_no_entry_error('MTEntryCategoriesFiltered'); |
|---|
| 51 |
my $cats = $e->categories; |
|---|
| 52 |
return '' unless $cats && @$cats; |
|---|
| 53 |
|
|---|
| 54 |
if ($args->{exclude_regex} ne '') { |
|---|
| 55 |
$cats = exclude_regex($cats, $args->{exclude_regex}); |
|---|
| 56 |
} |
|---|
| 57 |
|
|---|
| 58 |
if ($args->{exclude_branch} ne '') { |
|---|
| 59 |
$cats = exclude_branch($cats, $args->{exclude_branch}); |
|---|
| 60 |
} |
|---|
| 61 |
|
|---|
| 62 |
my $builder = $ctx->stash('builder'); |
|---|
| 63 |
my $tokens = $ctx->stash('tokens'); |
|---|
| 64 |
my @res; |
|---|
| 65 |
for my $cat (@$cats) { |
|---|
| 66 |
local $ctx->{__stash}->{category} = $cat; |
|---|
| 67 |
defined(my $out = $builder->build($ctx, $tokens, $cond)) |
|---|
| 68 |
or return $ctx->error( $builder->errstr ); |
|---|
| 69 |
push @res, $out; |
|---|
| 70 |
} |
|---|
| 71 |
my $sep = $args->{glue} || ''; |
|---|
| 72 |
join $sep, @res; |
|---|
| 73 |
} |
|---|
| 74 |
|
|---|
| 75 |
|
|---|
| 76 |
# Do something with array of categories -- this is just an example |
|---|
| 77 |
sub exclude_regex { |
|---|
| 78 |
my ($cats,$filter) = @_; |
|---|
| 79 |
|
|---|
| 80 |
my @filtered; |
|---|
| 81 |
foreach (@$cats) { |
|---|
| 82 |
push(@filtered, $_) unless $_->label =~ m/$filter/; |
|---|
| 83 |
} |
|---|
| 84 |
|
|---|
| 85 |
\@filtered; |
|---|
| 86 |
} |
|---|
| 87 |
|
|---|
| 88 |
sub exclude_branch { |
|---|
| 89 |
my ($cats, $exclude_label) = @_; |
|---|
| 90 |
|
|---|
| 91 |
my $exclude_cat = MT::Category->load({ label => $exclude_label }) || undef; |
|---|
| 92 |
return $cats if (!defined $exclude_cat); |
|---|
| 93 |
|
|---|
| 94 |
my @filtered; |
|---|
| 95 |
foreach (@$cats) { |
|---|
| 96 |
push(@filtered, $_) unless $_->is_descendant($exclude_cat); |
|---|
| 97 |
} |
|---|
| 98 |
|
|---|
| 99 |
\@filtered; |
|---|
| 100 |
|
|---|
| 101 |
|
|---|
| 102 |
} |
|---|