MTIf タグの like 属性について
MTIf タグ(MTUnless タグ)の like 属性について、利用方法を紹介します。
この内容は、先日行われた「WebSig24/7 MT4分科会 第1回イベント『WebSig24/7 2007年秋 MT4の日』」で頂いたご質問、
- like 属性に or 演算子のようなものは使えますか?
- like 属性を使って、title 要素に表示するデータを収集したいのですが?
の回答です。ご返事が遅くなりましたこと、この場をお借りしてお詫びいたします。
1.like 属性の機能
MTSetVar タグに設定された変数、または MTSetVarBlock, MTSetVarTemplate ブロックタグの変数値が、like 属性に記述された文字列とマッチする場合に実行します。
また、属性値には perl の正規表現を使うことができます(厳密には、属性値は正規表現としてしか扱われません)。
2.ソースコード
lib/MT/Template/ContextHandlers.pm の MTIf タグ(MTUnless タグ)の like 属性の処理は下の青色部分です。
sub _hdlr_if {
my ($ctx, $args, $cond) = @_;
my $var = $args->{name} || $args->{var};
my $value = $ctx->var($var);
:
} elsif (exists $args->{like}) {
my $re = eval { qr/$args->{like}/ };
return defined($value) && ($value =~ m/$re/) ? 1 : 0;
}
:
}
$args->{like} には like の内容が設定されており、内容が存在すれば変数 $re に代入します。この時、「qr// 演算子」を用いて、like の内容を正規表現として代入しています。
その後、m// 演算子を用いて、$value(事前に取得されたもの)とのパターンマッチの結果(1 または 0)を返却します。
3.サンプル1
MTSetVar タグで、変数 hoge の値に "foo" を設定しています。
MTIf タグでは hoge に "f" が含まれていたらブロック内を実行します。この場合は含まれているので、ブロック内の MTGetVar を実行します。
<$mt:setvar name="hoge" value="foo"$>
<mt:if name="hoge" like="f">
<$mt:getvar name="hoge"$>
</mt:if>
Perl で書くと、多分下記のようになります。
my $hoge = 'foo';
if ($hoge =~ m/f/) {
print $hoge;
}
4.サンプル2
MTSetVar タグで、変数 hoge の値に "foo" を設定しています。
MTIf タグでは hoge に "foo" または "var" が含まれていたらブロック内を実行します。この場合は含まれているので、ブロック内の MTGetVar を実行します。
<$mt:setvar name="hoge" value="foo"$>
<mt:if name="hoge" like="foo|var">
<$mt:getvar name="hoge"$>
</mt:if>
Perl で書くと、多分下記のようになります。
my $hoge = 'foo';
if ($hoge =~ m/foo|var/) {
print $hoge;
}
4.サンプル3
ブログ記事リストのタイトルに "foo" または "var" が含まれているものだけを表示します。
<MTEntries>
<mt:setvarblock name="entrytitle"><$MTEntryTitle$></mt:setvarblock>
<mt:if name="entrytitle" like="foo|var">
<$mt:getvar name="entrytitle"$>
</mt:if>
</MTEntries>
Perl で書くと、多分下記のようになります。
for my $entrytitle (@entries) {
if ($entrytitle =~ m/foo|var/) {
print $entrytitle;
}
}
冒頭の2つめのご質問に適用する場合、このブロック全体を tilte 要素で括れば、ある程度期待する表示にできると思います。質問の解釈が誤ってましたら再度ご連絡ください。
5.参考
- Movable Type のブロックタグにファンクションタグで使うモディファイアを指定する
- EntryCategoryID プラグイン
- MTIf タグの test モディファイアで Perl の式を利用する
- MTIf タグの tag モディファイアでテンプレートタグの値を直接参照する
- MTLoop タグによる配列変数・ハッシュ変数の制御
- Movable Type 4.1 / MTOS における変数での算術演算子の利用方法
- Movable Type 4.1 / MTOS における配列とハッシュの利用方法
- サイドバーの表示をメインページと同じにする
- MTSetVarBlock と MTSetVarTemplate の違いについて
- strip 属性で日付の空白を削除する
- MTIgnore タグ
- エントリーで table タグを記述する場合の注意
- MTLink によるページ作成
- Movable Type のディレクトリ
- 全エントリーリスト・全コメントリスト・全トラックバックリストを表示
- カテゴリーアーカイブで MTCategoryDescription をタイトルに使う
- 「最近のエントリー」の日別表示
- コメント投稿者の情報表示をカスタマイズする
- MTCommentPreviewIsStatic の振る舞いについての改善案

