# # MTEntryCategoriesModified # 2005/10/10 1.00 First Release # # Copyright(c) by H.Fujimoto # package MT::Plugin::EntryCategoriesModified; use strict; use MT; use MT::Template::Context; use MT::Entry; use MT::Category; use MT::Plugin; use constant VERSION => '1.00'; use constant NAME => 'EntryCategoriesModified'; eval("use Storable;"); if (!$@ && MT->can('add_plugin')) { my $plugin = MT::Plugin->new; if (MT->version_number >= 3.2) { $plugin->name(NAME); $plugin->version(VERSION); $plugin->author_name('Hajime Fujimoto'); $plugin->author_link('http://www.h-fj.com/blog/'); } else { $plugin->name(NAME . ' ' . VERSION); } $plugin->description('Modified version of MTEntryCategories.'); MT->add_plugin($plugin); } MT::Template::Context->add_container_tag(EntryCategoriesModified => \&entry_categories_modified); MT::Template::Context->add_tag(EntryCategoryCount => \&entry_category_count); MT::Template::Context->add_conditional_tag(EntryIfPrimaryCategory => \&entry_if_primary_category); MT::Template::Context->add_conditional_tag(EntryIfSecondaryCategory => \&entry_if_secondary_category); sub entry_categories_modified { my ($ctx, $args, $cond) = @_; my $tokens = $ctx->stash('tokens'); my $builder = $ctx->stash('builder'); my @res = (); my $entry = $ctx->stash('entry') or return $ctx->_no_entry_error('MTEntryCategories'); my $mode = $args->{mode} || 'all'; my $pri_cat = $entry->category; my $sec_cats = $entry->categories; if ($pri_cat && ($mode eq 'primary' || $mode eq 'all')) { local $ctx->{__stash}->{category} = $pri_cat; defined(my $out = $builder->build($ctx, $tokens, $cond)) or return $ctx->error($ctx->errstr); push @res, $out; } if ($mode eq 'secondary' || $mode eq 'all') { for my $sec_cat (@$sec_cats) { if (!$pri_cat || $sec_cat->id != $pri_cat->id) { local $ctx->{__stash}->{category} = $sec_cat; defined(my $out = $builder->build($ctx, $tokens, $cond)) or return $ctx->error($builder->errstr); push @res, $out; } } } my $glue = $args->{glue} || ''; join $glue, @res; } sub entry_category_count { my ($ctx, $args) = @_; my $entry = $ctx->stash('entry'); my $count = scalar @{$entry->categories}; if ($args->{secondary}) { $count-- if ($entry->category); } $count; } sub entry_if_primary_category { my ($ctx, $args) = @_; return defined($ctx->stash('entry')->category); } sub entry_if_secondary_category { my ($ctx, $args) = @_; $args->{secondary} = 1; (&entry_category_count($ctx, $args) > 0); } 1;