「WordPressで学ぶPHP(4)通信編」を発売しました。
本書は、「WordPressで学ぶPHP(1)変数・制御構造編」「WordPressで学ぶPHP(2)データ構造編」「WordPressで学ぶPHP(3)関数編」の続編にあたり、Webブラウザとサーバー(PHP)との通信と、PHPから他のサーバーに通信することについて解説します。
変数処理を改良するプラグイン(その1)
2005年12月28日 12時20分
以下の不具合があったので修正しました。
・MTIfNumVarrタグで、比較対照の値が0の時に正しく比較ができていませんでした。
・MTIfStrVarrタグで、比較対照の値が空文字列の時に正しく比較ができていませんでした。
Movable Typeでは、「MTSetVar」「MTGetVar」というテンプレートタグを使うことで、テンプレート内で「変数」を扱うことができます。
ただ、この2つのタグだけでは、変数の使い道が限定的になります。
そのためか、これらのタグはあまり使われていないようです。
そこで、変数の扱いを改良するプラグインを作成しました。
今日は、変数の概要と、このプラグインのテンプレートタグの書き方を解説します。
1.MTSetVar/MTGetVarタグについて
まず、このプラグインの前段階として、MTSetVar/MTGetVarタグの使い方を解説しておきましょう。
MTSetVar/MTGetVarタグは、「変数」を扱うタグです。
変数とは、値を入れておく入れ物のことです。
MTSetVarタグは、変数に値を入れる働きをします。書き方は以下のようになります。
<MTSetVar name="変数名" value="変数に入れる値">
一方、MTGetVarタグは、変数の値をページに出力するものです。書き方は以下のようになります。
<MTGetVar name="変数名">
例えば、テンプレートに以下のような部分を入れるとします。
<MTSetVar name="var" value="ABC"> <MTGetVar name="var">
この場合、1行目のMTSetVarタグで、変数varに「ABC」という値が入ります。
次に、2行目のMTGetVarタグで、変数varの値が出力されます。1行目で変数varに「ABC」を入れましたので、このタグによって「ABC」が出力されることになります。
2.VarHandlerプラグインのインストール
MTSetVar/MTGetVarタグでは、変数に値を入れることと、その値を出力することができます。
ただ、変数間で計算をしたり、変数の値で条件判断したりする機能がありません。
そこで、それらの機能を持ったプラグインとして、「VarHandler」というものを作りました。
VarHandlerプラグインは、以下のページからダウンロードすることができます。
プラグインの継続的な開発やサポートのために、プラグインをご利用された方は、ドネーション(寄付)を行っていただけると幸いです。
ドネーションの方法は、こちらのページをご参照ください。
また、このプラグインの他にも、いくつかのプラグインを配布しています。
配布中のプラグインは、Movable Type Plugin Directoryのページをご参照ください。
Movable Typeのプラグイン開発等のドキュメント「Movable Type Developer's Guide Volume 1」も販売しています。
ご自分でプラグインを作ってみたい方に、ぜひお勧めしたい一冊です。
詳細は特設ページをご覧ください。
表示されたソースをすべてコピーしてメモ帳等に貼り付け、「VarHandler.pl」のファイル名をつけて保存してください。
そして、Movable Typeの「plugins」ディレクトリにアップロードしてください。
3.変数間で計算するタグ
このプラグインをインストールすると、いくつかのテンプレートタグが追加されます。
まず、変数間で計算をするタグとして、以下の5つが追加されます。
テンプレートタグ | 計算の種類 |
---|---|
MTAddVar | 足し算 |
MTSubVar | 引き算 |
MTMultVar | 掛け算 |
MTDivVar | 割り算 |
MTConcatVar | 文字として連結 |
いずれのタグも、「name」と、「value」または「name2」のアトリビュートをとります。
<MT○○○Var name="変数名" value="値">とすると、変数と値との間で計算が行われ、その結果が変数に入れなおされます。
また、<MT○○○Var name="変数1" name2="変数2">とすると、変数1と変数2との間で計算が行われ、その結果が変数1に入れなおされます。
例えば、以下のようにタグを組み合わせるとします。
<MTSetVar name="var" value="2"> <MTAddVar name="var" value="3">
この場合、1行目のMTSetVarタグで、変数varの値が2になります。
そして、2行目のMTAddVarタグで変数varに3が足され、値が5に変わります。
例えば、以下のようにタグを組み合わせるとします。
<MTSetVar name="var1" value="ABC"> <MTSetVar name="var2" value="DEF"> <MTConcatVar name="var1" name2="var2">
この場合、1行目と2行目のMTSetVarタグで、変数var1/var2の値が、それぞれ「ABC」/「DEF」になります。
そして、3行目のMTConcatVarタグで変数var1の値(「ABC」)に変数var2の値(「DEF」)が連結され、変数var1の値は「ABCDEF」になります。
なお、これらのタグは計算を行うだけで、計算結果は出力しません。
出力はMTGetVarタグで行います。
3.変数の値を条件判断に使うタグ
変数の値で条件を判断して、処理を分けるようにすることもできます。
そのためのタグとして、以下の2つがあります。
テンプレートタグ | 条件判断の種類 |
---|---|
MTIfNumVar | 変数の値を数値として他の値や変数と比較 |
MTIfStrVar | 変数の値を文字列として他の値や変数と比較 |
いずれのタグも、「name」と、「value」または「name2」のアトリビュートをとります。
<MTIf○○○Var name="変数名" value="値">とすると、変数と値とを比較して、等しいかどうかで処理が分けられます。
また、<MTIf○○○Var name="変数1" name2="変数2">とすると、変数1と変数2の値を比較して、等しいかどうかで処理が分けられます。
例えば、以下のようにタグを組み合わせるとします。
<MTIfNumVar name="var" value="1"> ABC <MTElse> DEF </MTElse> </MTIfNumVar>
この場合、変数varの値が1になっていれば「ABC」が出力され、そうでなければ「DEF」が出力されます。
4.値を入れるタグ
変数に値を入れるタグとして、前述のMTSetVarタグがありますが、それを拡張した「MTEqualVar」「MTTagValueVar」というタグも追加されます。
<MTEqualVar name="変数1" name2="変数2">とすることで、変数1に変数2の値を入れることができます。
また、MTTagValueVarタグはコンテナタグで、コンテナ内の内容(テンプレートタグを含む)を変数に入れることができます。
例えば、以下のようにタグを組み合わせると、変数countにはBlog全体のエントリー数が入ります。
<MTTagValueVar name="count"><MTBlogEntryCount></MTTagValueVar>
MTTagValueVarタグとMTIf○○○Varタグを組み合わせると、「テンプレートタグの値が○○○かどうかで処理を分ける」といったことができます。
明日は、これらのタグを使った具体的な例を紹介する予定です。
Movable Typeのプラグイン集「MT Cloud Starter Kit」をぜひご利用ください
かげさん
前にMTタグをいじってて
これができなくて、わからん!
と騒いでいた時期があります。
できないものは、できないんだよ
と言ってあきらめたんですが
プラグインを作るとできるんですね。
って、ココログじゃむりだぁ!(笑)
壱
>かげさん
こんにちは。
プラグインで機能を拡張していくことができる点は、MTの大きなメリットです。
やはりココログからMTに移行するしかないでしょう(笑)。
おねい
質問があります。
VarHandler.plをインストールしてみたのですが、うまく反映されないかったので、プラグインの設定を確認してみたところ、エラーがでてしまいました。MovableTypeのバージョンは3.33ですが、それが原因でしょうか?
---以下がエラーメッセージです。
VarHandler.pl
プラグイン・エラー:
Unrecognized character \x80 at /Library/WebServer/CGI-Executables/mt/plugins/VarHandler.pl line 29. Compilation failed in require at lib/MT.pm line 619.
---ここまで
システム的にはあまり詳しくないので、ご指導よろしくお願い申し上げます。
壱
>おねいさん
こんにちは。
アップロードしたソースコードの中に、全角文字か何かが混入しているようです。
プラグインのソースコードをもう一度コピーしなおして、再度アップロードしてみてください。
おねい
壱さま
ご指摘ありがとうございます。
解決いたしました。
こぴぺしたエディターのせいか、半角¥が、化けてしまっていたようです。
プラグイン設定のところのエラーも出なくなりました。
お忙しい中、素早くご回答いただき、大変助かります。
どうもありがとうございました!
紫
質問させてください。
http://yukarinoniwa.mamapapuru.net/
でサイト作成中の紫と申します。
Q<Mtsetvar name="ctlbl" value="<$MTCategoryLabel$>">
とすることはできないのでしょうか?
valueにMTの変数タグって使えないのですか?
<mtgetvar name="ctlbl">とすると
"<
と表示されちゃうんです。
。。。ナゼ?
これが使えたら、カテゴリーアーカイブのテンプレートで、カテゴリーアーカイブ名を判定して、スタイルシートを変えたりできるはず。。
そうすると、タブインデックスとかが簡単にできると思ったのですが。。。
どこか根本的に勘違いしてるんでしょうか。:pp_02.gif:教えていただけませんか?:pp_01.gif:
紫
すみません。
コメントにMTかいちゃったら、まずかったのでしょうか。
(>_<)
すみません。
メールにします。。。
壱
>紫さん
こんにちは。プラグインご利用ありがとうございます。
Movable Typeでは、テンプレートタグのアトリビュートに、他のテンプレートタグの値を指定するといったことは、標準の機能では残念ながらできません。
ただ、当プラグインでは、ご希望のようなことをしたい場合は、以下のように書くことができます。
<MTTagValueVar name="ctlbl"><$MTCategoryLabel$></MTTagValueVar>
また、MT3.3以上をお使いであれば、MT標準のMTSetVarBlockというタグを使って、以下のように書くこともできます。
<MTSetVarBlock name="ctlbl"><$MTCategoryLabel$></MTSetVarBlock>
ちなみに、任意のテンプレートタグで、アトリビュートに他のテンプレートタグの値を使いたい場合は、Stepan Riha氏が作成した「MTTagInvoke」というプラグインを使う方法があります。
http://www.nonplus.net/software/mt/MTTagInvoke.htm
紫
壱さん、すばやく対応ありがとうございました。
すっごくよくわかりました。
ちょっとやってみて、また報告させてもらいます。
今後ともちょくちょくよらせて下さい。
でも、MTってスゴイですね。これタダ?ってちょっとビックリ。
あ、それと、よければリンクを貼らせてもらってもよろしいですか?
:pp_01.gif:
ほりけん
こんにちは。
変数の計算できるプラグインを探していて辿りつきました。
ただ、探していたのが余りを求められるもので
算 術 演 算 子の%の代わりになるものを求めてました。
ソースを見たところ $ctx の部分で計算されているようですが、
ここで%を入れてあげるだけで
余りを求めるタグを作れますでしょうか?
もし、簡単に対応できるようであれば
ご教授いただけたらと思います。
よろしくお願い致します。
壱からほりけんへの返信
>ほりけんさん
こんにちは。
以下のようにすれば、余りを求める「MTModVar」というタグを追加することができます。
まず、プラグインの先頭の方にある「# add tag」の後に、以下の文を追加します。
MT::Template::Context->add_tag(ModVar => \&mod_var);
さらに、以下のmod_varサブルーチンを追加します。
# mod_var main
sub mod_var {
my ($ctx, $args) = @_;
my ($var1, $var2);
return $ctx->error('Attribute \'name\' is required.')
unless ($args->{name});
&_check_attribute($ctx, $args, \$var1, \$var2, 1);
$ctx->{__stash}{vars}{$args->{name}} = $var1 % $var2;
'';
}
Fu-Chin
こんにちわ。メールフォームプラグイン(Ver1)共々、VarHandlerを利用させていただいております。(以前メールフォームについてコメント質問させていただきました)
コレを使うと、MT3でも結構融通が利くようになり、非常に便利ですねー。メールフォームプラグインも含め、大変便利なものを無料でご提供いただけること、感謝いたします。
ところで、このプラグインで、条件判定の際に一度に複数の値/文字列と比較するようには出来ないでしょうか?現在「Compare Plugin」を使っていますが、VarHandlerでも一度に複数と比較する処理が出来ないかと思いまして。。興味おありでしたらご考慮いただけますと嬉しいです。
(たとえば)文字列がMT/Movable Typeのいずれかと一致しているかどうか調べたいとき、
<MTIfStrVar name="hogehoge" value="MT,Movable Type" glue=",">[一致したとき実行する内容]</MTIfStrVar>
のような感じで。。(glueアトリビュートで、value内の区切り文字を任意に指定できるとか。)
大変図々しいコメント、申し訳ありません。
壱からFu-Chinへの返信
>Fu-Chinさん
こんにちは。
申し訳ありませんが、MT3用のプラグインはバージョンアップする予定はありません。
Fu-Chin
こんにちわ。くだらない投稿にもかかわらずご回答いただき、ありがとうございます。お目汚し大変失礼いたしました。今後のご活躍、期待しております!