Home > Logs > December 2007 > This Entry
プラグイン内で、標準出力に print する方法
プラグインの中では return してあげないと標準出力(ブラウザ)で処理結果を確認することができませんが、これでは何かと不便だし、まとめて出力したところで爽快感に欠けます。また、処理内容が多ければ多いほどブラウザに対してレスポンスを返さない時間が長いことになり、ユーザーは不安になるかもしれません。なので、処理内容をリアルタイムに出力するプラグインを作成するためのひな形プラグイン「ListingSample プラグイン」を作成しました。これをもとに、標準出力に print する方法を解説します。
start.tmpl を MovableType に構築させ、出力させる
まずこのプラグインの構成ですが、ListingSample フォルダの中に、tmpl フォルダがあります。この中に、処理中に使用するテンプレートが入っています( lib フォルダはグローバル化のためのものです)。この中に start.tmpl がありますが、この内容は以下のようになっています。
<mt:include name="include/header.tmpl" force_header="1"> <div class="import-process"> <div id="progress-bar"><img src="<mt:var name="static_uri">images/indeterminate-progress-bar.gif" alt="" height="24" width="124" /></div> <pre>
div の class に import-process を指定しているのは、ブログ記事のインポートのような形で出力するためです。
これを、MovableType に build_page させ、標準出力に print させますが、その前にブラウザに対して http ヘッダを送ってやります。これらはすべてメソッドで行います。
my $app = shift;
$app->send_http_header('text/html');
$app->{plugin_template_path} = File::Spec->catdir($plugin->path, 'tmpl');
$app->print( $app->build_page( 'start.tmpl', $param ) );
plugin_template_path は、プラグインのテンプレート格納ディレクトリのパスを指定しています( File::Spec を使うのは Windows サーバーにも対応するためです)。上記は、プラグインと並列に tmpl ディレクトリが存在し、その中に start.tmpl が格納される場合です。上記の start.tmpl のソースコードを見ると、相対パスで 「include/header.tmpl」が指定されていますが、この相対パスは mt.cgi の設置場所が基準となります( start.tmpl ではありません)。また、build_page メソッドはテンプレートとパラメータをもとに構築した html ソースを返します。
build_page メソッドで渡すパラメータ
いわゆる <MTSetVar name="page_title"> のようなテンプレートタグにおける変数は、以下のようにパラメータとして渡すことができます。上記の $param には、以下のようにパラメータを格納しておきます。
my $param = { page_title => 'ページのタイトル', };
page_title については start.html では end.html でも受け取られていませんが、start.tmpl 内で include している「include/header.tmpl」で受け取られ、ページのタイトルとして使用されます。
この間に処理内容を出力する
この後、end.tmpl を build_page して MovableType に print させますが、それまでの間( start.tmpl を print してから end.tmpl を print するまでの間)に、処理内容を出力させます。出力の仕方は、これまでと同様にメソッドを使います。以下のような形です。
$app->print( '出力させたい内容' );
end.tmpl を MovableType に構築させ、出力させる
最後に、end.tmpl を出力します。end.tmpl は「ListingSample プラグイン」の場合、以下のような内容です。
</pre>
</div>
<script type="text/javascript">
<!--
var progress = getByID("progress-bar");
if (progress) {
progress.style.display = "none";
}
// -->
</script>
<TMPL_INCLUDE NAME="include/footer.tmpl">
これを、start.tmpl と同様に MovableType に build_page させ、print させます。ちなみに javascript の内容は、プログレスバーを見えなくする、という処理です。最後まで処理が終わったから消しちゃうわけですね。
$app->print( $app->build_page( 'end.tmpl', $param ) );
これで処理終了です。
まとめと補足
このページを見ただけでは不十分だと思うので、詳しくは「ListingSample プラグイン」のソースを見てください。ここでは、要するに start.tmpl 部分と end.tmpl 部分を分け、その間に処理内容をメソッドで 出力させればいいんだ、ということがわかってもらえれば十分だと思います(必ずしもこのようにする必要はないのですが)。
Post Comment