MTのテンプレートを書いていると、現在のカテゴリの深さによって、表示を変えたりしたいときがあります。
トップカテゴリと、サブカテゴリのデザインを変更したり、表示するものを変えたり。
親カテゴリがあるかないかで判断するなどの方法もありますが、もっとシンプルに「カテゴリの深さを取得する」プラグインを考えてみました。
package MT::Plugin::CategoryDepth;
use strict;
use MT::Plugin;
use base qw( MT::Plugin );
use vars qw($PLUGIN_NAME $VERSION);
$PLUGIN_NAME = 'CategoryDepth';
$VERSION = '0.50';
use MT;
my $plugin = new MT::Plugin::CategoryDepth({
id => 'categorydepth',
key => __PACKAGE__,
name => $PLUGIN_NAME,
version => $VERSION,
author_name => 'M-Logic, Inc.',
author_link => 'http://m-logic.co.jp/',
registry => {
tags => {
function => {
'CategoryDepth' => \&hdlr_category_depth,
},
},
},
});
MT->add_plugin($plugin);
sub hdlr_category_depth {
my ($ctx, $args) = @_;
my $cat = ($ctx->stash('category') || $ctx->stash('archive_category'))
or return $ctx->error(MT->translate(
"You used an [_1] tag outside of the proper context.",
'<$MT'.$ctx->stash('tag').'$>'));
my @parents = $cat->parent_categories();
return $#parents + 2;
}
1;
これが、そのプラグインになります。
「category_depth.pl」などの名前でファイルに保存して、MTシステムにインストールしてください。
<$CategoryDepth$>タグで、カテゴリのレベルが取得できるので、SetvarBlockなどで変数に代入して、比較を行うとよいかと思います。
このプラグインのポイントは、
my @parents = $cat->parent_categories();
return $#parents + 2;
この部分です。
現在のカテゴリの親カテゴリをさかのぼって取得しています。
取得できた配列の最後の添字を取得して、それに2を足したものが「階層の深さ」になります。