モディファイア
各種タグの値は、モディファイア(修飾子)を使って整形・変換することができます。
モディファイアはもともとMODXにはない機能であり、かつてはPHxというプラグインによって実装できました。プラグイン機構による実装では無理があったため、最新のMODXでは本体機能(※旧名称・内蔵フィルター)として組み込まれています。
[*変数:モディファイア*]
または
[*変数:モディファイア(オプション)*]
こう記述します。
[*変数:モディファイアA:モディファイアB:モディファイアC*]
jQueryのように、複数のモディファイアを連結することができます。
[*変数:is(aaa):then(あいうえお):else(かきくけこ)*]
判定機能を持つモディファイア。上記の例では、変数の値が「aaa」の場合は「あいうえお」、そうでない場合は「かきくけこ」を表示します。
判定系モディファイアは、is・isnot・gt・lt・find・preg_match・memberofなど9種類あり、基本的にはthenモディファイア・elseモディファイアを組み合わせて用います。
[*変数:find(★):show*]
判定が正の場合に値をそのまま出力したい場合は、thenモディファイアではなくshowモディファイアを用いると簡単です。上記の例では、変数に「★」を含む場合に表示します。
[*変数:is(aaa):or:is(bbb):then(あいうえお):else(かきくけこ)*]
変数の値が「aaa」または「bbb」であれば「あいうえお」を、そうでなければ「かきくけこ」を表示します。
[*変数:gt(3):and:lt(10):then(あいうえお):else(かきくけこ)*]
変数の値が3より多く10より少ない場合に「あいうえお」を、そうでなければ「かきくけこ」を表示します。
※ orモディファイアやandモディファイアを用いるとタグの記述が複雑になるため、注意が必要です。
[*変数:GT(3):AND:LT(10):THEN(あいうえお):ELSE(かきくけこ)*]
モディファイアは大文字・小文字を区別しません。
[*longtitle:ifempty([*pagetitle*])*]
単体で判定と出力の変更を行なう特殊なモディファイア。上記の例では、[*longtitle*]の値が空の場合に[*pagetitle*]の値を出力します。
[*pagetitle:upperCase*]
タイトルに含まれる英文字を全て大文字に変換します。
[*pagetitle:zenhan*]
タイトルに含まれる英数字を全て半角に変換します。
[[Ditto?
&tpl='<a href="[+url+]">[+content:getimage(ogp)+]</a><br />'
]]
本文中に含まれるimgタグのうち「ogp」という文字列を含むものをひとつ抽出します。
(<img src="test.jpg" class="ogp" /> など)
[*pagetitle:strip_tags*]
タイトルに含まれるHTMLタグを削除します。
[*pagetitle:strip_tags:hanzen*]
タイトルに含まれるHTMLタグを削除した上で、英数字を全角に揃えます。
[*content:replace(なぜでしょう。|なんでやねん。)*]
関西弁に変換
モディファイアは自作できます。
[スニペット名] 関西弁
return str_replace(array('です。','します。'),array('やねん。','するで。'),$value);
上記のようなスニペットを作成します。タグの値は $value という変数を通じて受け取ることができるので、これを加工して返します。
[*content:関西弁*]
こう記述します。
[チャンク名] 見出し
<h2 class="title">[+value+]</h2>
上記のようにチャンクでモディファイアを作ることもできます。
[*pagetitle:見出し*]
このように使えます。
Movable Typeのモディファイアとの比較
Movable Typeでも同じようにモディファイアを使うことができます。歴史の長いCMSのためノウハウが充実しており、MODXでも参考になる情報が多いです。
remove_htmlモディファイア
<mt:entryexcerpt remove_html="1" />
MTMLでは、上記のように記述すると、ブログ記事の概要に含まれるHTMLタグを除去して表示します。担当者がHTMLタグを概要フィールドに記述してページの表示が崩れたりすることを防ぐことができます。(Movable Type側の解説はこちら)
[*description:remove_html*]
MODXでは上記のように記述すると同じように動作します。
encode_htmlモディファイア
<title><mt:entrytitle encode_html="1" /></title>
タグの値をHTMLエンコードします。MTMLでは上記のように記述します。(Movable Type側の解説はこちら)
<title>[*pagetitle:encode_html*]</title>
MODXでは上記のように記述します。
HTMLタグを記述させたくない投稿フィールドは全て、remove_htmlまたはencode_htmlモディファイアを用いるとよいでしょう。たとえば<meta>要素のdescription属性や<title>要素などでこれらのモディファイアが必要です。
_defaultモディファイア
<$mt:BlogDescription _default="ブログの概要は入力されていません。"$>
MTMLで上記のように書くと、タグの値が空の場合に代わりに出力する文字列を指定できます。(Movable Type側の解説はこちら)
[*description:_default(記事の概要は入力されていません。)*]
MODXでは上記のように記述します。
[*description:_default(記事の概要は入力されていません。):encode_html*]
encode_htmlモディファイアを併用する場合はこう記述します。順序は逆でもかまいません。
<!--@IF:![*description*]>
記事の
概要は
入力
されていません。
<@ENDIF-->
代わりに出力したい文字列が複数行に及ぶ場合は上記の記法を用いるほうが分かりやすいかもしれません。
replaceモディファイア
モディファイアはリソース変数以外のタグでも全く同じように使うことができます。
<ul>
<MTEntries limit="5">
<li><$MTEntryTitle$></li>
</MTEntries>
</ul>
たとえば記事を5件出力する場合、MTMLでは上記のように記述します。
<ul>
<MTEntries limit="5">
<li><$MTEntryTitle replace="Movable Type","MT"$></li>
</MTEntries>
</ul>
上記のように書くと、各記事タイトルに含まれる「Movable Type」という文字列を「MT」に変換することができます。(Movable Type側の解説はこちら)
<ul>
[[Ditto?
&display=5
&tpl='<li>[+pagetitle:replace(MODX Evolution,Evo)+]</li>'
]]
</ul>
MODXでは上記のように記述します。
※MODXは記事の一覧を表示する機能を本体では持っていないため、Dittoスニペットを用います。
複数モディファイアの組み合わせ
記事の文字数が300文字未満の場合は「この記事を読むのにかかる時間:1分以内」と表示し、300文字以上の場合は「1分以上」と表示したい場合。
<MTSetVars>
body_count=<$MTEntryBody remove_html="1" count_characters="1"$>
</MTSetVars>
<MTIf name="$body_count" lt="300">
この記事を読むのにかかる時間:1分以内
<MTElse>
この記事を読むのにかかる時間:1分以上
</MTIf>
MTMLでは上記のように記述します。(Movable Type側の解説はこちら)
<!--@IF:[*content:remove_html:count_characters:lt(300)*]>
この記事を読むのにかかる時間:1分以内
<@ELSE>
この記事を読むのにかかる時間:1分以上
<@ENDIF-->
MODXでは上記のように記述します。
Smartyのモディファイアとの比較
Smartyでもモディファイアを使うことができますので、MODXと比較してみます。
{$pageTitle|escape}
値に含まれるHTMLタグをHTMLエンコードしたい場合、上記のように記述します。
[*pagetitle:escape*]
MODXでは上記のように記述します。