« 2008年11月 | メイン | 2009年1月 »

2008年12月 アーカイブ

2008年12月10日

カテゴリの階層の深さを取得する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等のアプリケーション開発業務を行っています。
お問い合わせはこちらまで。

2008年12月24日

シェルアクセスできないレンタルサーバでMTのプラグインをデバッグする

今回もMTのデバッグネタです。 先日、弊社のプラグインをインストールしたところうまく動かない、というお客様がいらっしゃいました。手元の環境では問題なく動作していますが、お客様の管理画面にアクセスして調べてみると、やはりうまく動作してません。サーバのシェルにアクセスして調べようにも、お客様が契約されたレンタルサーバでは、シェルでのアクセスが出来ない環境でした。 こういう状況で使えるのが "PerlScript プラグイン":http://bradchoate.com/weblog/2002/07/27/mtperlscript です。このプラグインは、テンプレート内にPerlのスクリプトを記述できるようにするもので、再構築時にスクリプトを実行し、その結果を出力します。 プラグインには2つスクリプトが同梱されていて、それぞれ指定された場所へインストールするようドキュメントに書かれていますが、私は以下のようにファイルを配置し、プラグインディレクトリへコピーしました。 ==
    PerlScript
    |-- lib
    |   `-- bradchoate
    |       `-- perlscript.pm
    `-- perlscript.pl
== 使い方は、テンプレートにPerlスクリプトを記述し、MTPerlScriptタグで囲うだけです。 例として、MTのコンフィグをダンプするスクリプトを書くと以下のようになります。 ==
<MTPerlScript>
require MT;
require YAML;
print YAML::Dump(MT::config);
</MTPerlScript>
== 1つのテンプレートの中にMTPerlScriptタグをいくつも置くこともできます。 ==
<MTPerlScript>
print "begining of template";
</MTPerlScript>

<MTPerlScript>
print "end of template";
</MTPerlScript>
== サブルーチンを定義することも出来ます。 ==
<MTPerlScript package="mylib" once="1">
sub log {
  my ($str) = @_;
  print "<p>log: $str</p>\n";
}
</MTPerlScript>

<MTPerlScript>
mylib::log("middle of template");
</MTPerlScript>
== 作成したテンプレートを再構築し、出力内容を確認するという手順を繰返して、デバッグします。 かなり便利かつ強力なプラグインですが、その反面、テンプレートの編集権限さえあれば、何でも出来てしまう危険なプラグインでもありますので、取り扱いにはご注意ください。