TopMovable Typeテンプレートタグ > 2007年10月
2007年10月26日

MTIf タグの like 属性について

October 26,2007 1:38 AM
Tag:[, ]
Permalink

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.参考

Comments [11] | Trackbacks [0]
2007年10月22日

MTSetVarBlock と MTSetVarTemplate の違いについて

Movable Type 4 では、MTSetVar タグや MTSetVarBlock タグを用いた制御が数多く行われています。 本エントリーでは、新たに追加された MTSetVarTemplate タグについて解説します。

1.MTSetVarTemplate タグの機能

MTSetVarTemplate タグで囲まれた内容を、変数として値を設定します。

<MTSetVarTemplate name="foo">
  <!-- do something -->
</MTSetVarTemplate>

なお、MTSetVarTemplate タグは、ドキュメントによれば MT 管理画面での使用が目的らしいので、ユーザのテンプレートで用いる可能性は低いかもしれません。

2.MTSetVarBlock タグとの違い

MTSetVarBlock タグは、ブロック内の内容が処理された結果を値として取得しますが、MTSetVarTemplate タグは、ブロックの内容が MTGetVar、あるいは MTVar タグで呼び出された時点ではじめて評価されます。

3.サンプル

ここでは MTIncludeタグ・MTGetVar タグと組み合わせた、MTSetVarBlock タグと MTSetVarTemplate タグの振舞いの違いを示したいと思います。

3.1 MTSetVarBlock + MTInclude + MTGetVar(OK)

MTSetVarTemplate タグは用いず、アーカイブテンプレートの MTInclude タグが実行された時点で MTEntries 全体が評価されるサンプルです。

アーカイブテンプレート

<$MTInclude module="test"$>
<$MTGetVar name="entries"$>

テンプレートモジュール(test)

<MTSetVarBlock name="entries">
<MTEntries>
<$MTEntryTitle$>
</MTEntries>
</MTSetVarBlock>

3.2 MTSetVarBlock + MTInclude + MTGetVar(NG)

アーカイブテンプレートの MTInclude で MTEntryTitle が評価されますが、評価時点では MTEntryTitle が MTEntries コンテキスト外のため、再構築エラーとなるサンプルです。

アーカイブテンプレート

<$MTInclude module="test"$>
<MTEntries>
<$MTGetVar name="entries"$>
</MTEntries>

テンプレートモジュール(test)

<MTSetVarBlock name="entries">
<$MTEntryTitle$>
</MTSetVarBlock>

3.3 MTSetVarTemplate + MTInclude + MTGetVar(OK)

3.2項の MTSetVarBlock タグを MTSetVarTemplate タグに置き換えることで、アーカイブのMTInclude 時点でMTEntryTitleは評価されず、MTGetVar(=MTEntires ブロック内)で評価されるので、期待通りの動作になります。

アーカイブテンプレート

<$MTInclude module="test"$>
<MTEntries>
<$MTGetVar name="entries"$>
</MTEntries>

テンプレートモジュール(test)

<MTSetVarTemplate name="entries">
<$MTEntryTitle$>
</MTSetVarTemplate>

4.参考:MT4 のデフォルトテンプレート

3項でサンプルをいくつか比較しましたが、実際には、デフォルトテンプレートの MTEntries 関連のタグデザインは下記の通りです。
MTGetVar は用いず、アーカイブテンプレートの MTEntries ブロックに直接 MTInclude が記述され、MTEntryTitleが評価されます。

アーカイブテンプレート

<MTEntries>
<$MTInclude module="test"$>
</MTEntries>

テンプレートモジュール(test)

<$MTEntryTitle$>

5.まとめ

MTSetVarTemplate を用いるケースとして、下記が考えられます。

  • テンプレートモジュールをひとつにまとめたい
  • ブロックタグとファンクションタグのテンプレートを分離したい
  • ファンクションタグのテンプレートモジュールに、複数のバリエーションをもたせる(MTGetVar で振り分ける)

管理画面テンプレートは調査していないので、実際にはもう少し適正な使用方法があるかもしれません。

Comments [0] | Trackbacks [0]
Now loading...
ギターに入った猫
掲載広告募集
Styles
Font Size
Default
For defective color vision
Gray Scale
RGB Color
Search this site

このブログをメールで購読する by:FeedBurner

AMN
Categories
Monthly Archives
2019年
2018年
2017年
2016年
2015年
2014年
2013年
2012年
2011年
2010年
2009年
2008年
2007年
2006年
2005年
2004年
2003年
BlogPeople
Syndicate this site
FeedBurner(RSS1.0/RSS2.0/Atom)
Counter
これまでのアクセス
Powered by
Movable Type 6.0.3