BLOG

Go to top


MT::App::CMS::template_source.*** でデフォルトのテンプレートと自前で用意したテンプレートファイルの内容を差し替える場合はこんなふうに書くとソースが短くなる

June 28, 2008 12:43 AM
sub _cb_template_source {
    my ( $cb, $app, $tmpl ) = @_;
    my $method = $cb->method;
    if ($method =~ /MT::App::CMS::template_source\.(.*)/) {
        my $plugin_tmpl = File::Spec->catdir( $plugin->path, 'alt-tmpl', $1 . '.tmpl' );
        my $src = _read_file( $plugin_tmpl ) if ( -e $plugin_tmpl );
        if ( $src ) {
            $src =~ s/<__plugintrans phrase="(.*?)">/$plugin->translate($1)/eg;
            $$tmpl = $src;
        }
    }
}

$cb->method; で MT::App::CMS::template_source.テンプレート名 が得られるので、そこから正規表現でテンプレート名を取り出し、プラグインを格納しているフォルダ内の alt-tmpl に入れた同名のファイルと差し替える処理。丸ごと書き換えられてしまうので、他にもプラグインで似たようなことをしている場合は注意が必要ですが、Perl は正規表現よりも eq とか ne とかで比較するとか、直接代入するとかの方が処理が早いので、個人的には正規表現で transform するよりもこのようにする方が好きです(ファイル読み込み処理が入ってるから、むしろ重いかもしれないけど、なんとなく習慣として…)。このようにして、例えばテンプレート名で分岐とかすれば、ひとつのルーチンですべてのコールバック定義をまかなえたりします。ただし、コードの視認性は保証しませんYO

このようにファイルの内容と本来のテンプレートの内容を入れ替えてしまう場合、 <__trans phrase="***"> でプラグインによってローカライズしようとしても効かないので、これは置換で行うようにしています。その際、プラグインのローカライズファイルで定義するものと、MT 本来のローカライズとを区別しておかないとならないので、 __trans を __plugintrans としました。

_read_file ルーチンは独自に定義している、使い慣れたファイル読み込みルーチンなのだけれど、このくらいは MTAPI にあるんじゃないかなと思います(探してません)。wantarray の場合は各行を要素とする配列を返し、そうでない場合は全行をまとめて変数として返します。

sub _read_file {
    my $file_path = shift;
    if ($file_path) {
        open (FH, $file_path);
        if (wantarray) {
            my @lines = <FH>;
            close FH;
            return @lines if (@lines);
        } else {
            my $str;
            while ( my $line = <FH>) {
                $str .= $line;
            }
            close FH;
            return $str if ($str);
        }
    }
}

前回の記事が長かったので、今回はこのへんで…

Comments


Contact me

Copyright © 2005 - 2017 okayama All rights reserved.