TopMovable Typeテンプレートタグ > MTIf タグの like 属性について
2007年10月26日

MTIf タグの like 属性について

Posted at October 26,2007 1:38 AM
Category:[テンプレートタグ]
Tag:[, ]

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

Posted by yujiro
関連記事
人気エントリー
トラックバックURL


コメントする

*必須



お知らせ:2008年5月現在、多忙のため、7月頃までコメントを速やかに回答できない状態が続きます。ご質問の内容によっては回答が7月以降になる可能性がありますので、予めご了承ください。

太字 イタリック アンダーライン ハイパーリンク 引用

コメント投稿後にScript Errorや500エラーが表示された場合は、すぐに再送信せず、ブラウザの「戻る」ボタンで一旦エントリーのページに戻り(プレビュー画面で投稿した場合は、投稿内容をマウスコピーしてからエントリーのページに戻り)、ブラウザをリロードして投稿コメントが反映されていることを確認してください。

コメント欄に(X)HTMLタグやMTタグを記述される場合、「<」は「&lt;」、「>」は「&gt;」と入力してください。例えば「<$MTBlogURL$>」は「&lt;$MTBlogURL$&gt;」となります(全て半角文字)

Now loading...
Entries of this Category
QRcode

現在停止中です
携帯電話からこのQRcodeを撮影することで携帯用URLを取得することができます

URI for cellular phones
ギターに入った猫
Styles
Font Size
Default
For defective color vision
Gray Scale
RGB Color
Search this site

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

loading ...
BlogPeople
Now loading...
Syndicate this site
FeedBurner(RSS1.0/RSS2.0/Atom)
Counter
これまでのアクセス
クリエイティブ・コモンズ・ライセンス
Powered by
Movable Type 4.1
 
List Me!