« Windows環境のMTでmemcachedを使う | メイン | シェルアクセスできないレンタルサーバでMTのプラグインをデバッグする »

カテゴリの階層の深さを取得するMTプラグイン

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を足したものが「階層の深さ」になります。

お問い合わせ

エムロジック株式会社ではMovable Typeによるサイト構築やプラグイン開発、iPhone・Windows等のアプリケーション開発業務を行っています。
お問い合わせはこちらまで。

コメントを投稿