テンプレートの書き方
FreeLayoutCustomFieldプラグインで入力したデータは、テンプレートタグで出力することができます。ダイナミックパブリッシングにも対応していますので、静的/動的のどちらの出力も行うことができます。この節では、テンプレートタグの書き方を解説します。
個々のカスタムフィールドに対応するブロックタグ
フリーレイアウト型のカスタムフィールドの値を出力するには、まずそのカスタムフィールド全体を表すブロックタグを書きます。
カスタムフィールドを作成する際にテンプレートタグ名を決めますが、そのテンプレートタグ名の後に「Block」を付けたテンプレートタグ(ブロックタグ)が追加されます。このテンプレートタグのブロックの中で、個々のフィールドの値を出力していきます。
例えば、記事にフリーレイアウト型のカスタムフィールドを追加し、そのテンプレートタグ名を「EntryFLCF」にしたとします。この場合、「MTEntryFLCFBlock」というブロックタグが追加されます。このタグのブロックの中で、このカスタムフィールドに含まれる個々のフィールドの値を出力します。
カスタムフィールドの設定でテンプレートタグ名を「EntryFLCF」にした場合のタグの組み方
<mt:EntryFLCFBlock>
個々のフィールドの値を出力するテンプレートタグやHTML等
</mt:EntryFLCFBlock>
同一フィールドの組み合わせを複数回入力できるようにしている場合や(同一フィールド群の複数回追加の「同一フィールド群の複数回追加の概要」を参照)、ユニットを複数回入力できるようにしている場合、その回数分だけ、ブロックの内部が繰り返されます。
また、Movable Typeの他の繰り返し系テンプレートタグと同様に、ブロック内では__first__/__last__/__odd__/__even__/__counter__の各変数を使うことができます。
さらに、ユニットを使っている場合、同じユニットの連続に関係して、以下の各変数も定義されます(各変数とも、先頭と最後の「__」はアンダースコア2つで、間の「_」はアンダースコア1つ。同じユニットが複数回連続するときに、その部分の前後を何かのタグで囲みたい場合などに使うことができます。
同じユニットの連続に関して定義される変数
変数 | 内容 |
__unit_first__ | 最初のユニットの時は1、そうでなければ0 |
__unit_last__ | 最後のユニットの時は1、そうでなければ0 |
__unit_odd__ | 奇数番目のユニットの時は1、そうでなければ0 |
__unit_even__ | 偶数番目のユニットの時は1、そうでなければ0 |
__unit_counter__ | カウンター |
例えば、記事用のあるカスタムフィールドで、「header」と「text」の2つのユニットを定義しているとします。そして、ある記事ではheader→text→text→text→header→text→textの順にユニットを追加したとします。この場合、__unit_first__等の変数の値は以下のようになります。
ユニット | __unit_first__ | __unit_last__ | __unit_odd__ | __unit_even__ | __unit_counter__ |
header | 1 | 1 | 1 | 0 | 1 |
text | 1 | 0 | 1 | 0 | 1 |
text | 0 | 0 | 0 | 1 | 2 |
text | 1 | 1 | 1 | 0 | 3 |
header | 1 | 1 | 1 | 0 | 1 |
text | 1 | 0 | 1 | 0 | 1 |
text | 0 | 1 | 0 | 1 | 2 |
MTFLCFValueタグ
カスタムフィールド内の個々のフィールドの値を出力するには、「MTFLCFValue」というテンプレートタグ(ファンクションタグ)を使います(ただし、アセット系のフィールドを出力する際は、後述の「MTFLCFAsset」タグを使用)。「field」または「name」というモディファイアを使って、出力するフィールドの名前を指定します。
例えば、前述の例のように、カスタムフィールドのテンプレートタグ名を「EntryFLCF」にしたものとします。また、このカスタムフィールドに「text」という名前のフィールドを定義したとします。この場合、このtextフィールドの値を出力するには、以下のようにテンプレートを組みます。MTFLCFValueタグの「field="text"」のモディファイアは、「name="text"」でも同じ動作になります。
textフィールドの出力
<mt:EntryFLCFBlock>
・・・
<$mt:FLCFValue field="text"$>
・・・
</mt:EntryFLCFBlock>
なお、フィールドの型によって、値の出力方法は以下の表のようになります。
フィールドの値の出力方法
フィールドの型 | 出力方法 |
1行テキスト(text) セレクト(select) ラジオボタン(radio) |
値をそのまま出力 |
複数行テキスト(textarea) | 値に含まれる改行を<br />タグに変換し、空の改行が出るたびにp要素で囲んで出力(記事を作成する際に、出力フォーマットを「改行を変換」にした場合と同じ動作)。 |
チェックボックス(checkbox) | チェックがオンの場合は1、チェックがオフの場合は空文字 |
日付と時刻(datetime) 日付(date) 時刻(time) |
日付/時刻として書式づけて出力 MTEntryDate等の日付系テンプレートタグと同様に、formatモディファイアで書式を指定することも可能 |
no_filter モディファイア
テキスト複数行のフィールドの利用時、Movable Type 本体の Util 関数を使って値を整形しているため、ブロックタグではない値は P タグで囲われます。no_filter="1"とすると、値をそのまま出力したいケースに対応できるようになります。
デフォルトは 0 で、1 にするとテキストフィルターを掛けずにそのまま出力します。
<$mt:FLCFValue field="text" no_filter="1" $>
MTFLCFOptionLabelタグ
セレクト(optgroupありも含む)とラジオボタンのフィールドでは、MTFLCFOptionLabelというテンプレートタグを使うこともできます。このテンプレートタグは、選択された項目に対応する表示値を出力するのに使います。
例えば、「sel」という名前のセレクト(ラジオボタン)のフィールドを作った時に、MTXXXBlockタグのブロック内に以下のようなテンプレートを組むと、そこで選択された項目の送信値と表示値を両方出力することができます。
送信値と表示値の両方を出力する
送信値:<$mt:FLCFValue field="sel"$> 表示値:<$mt:FLCFOptionLabel field="sel"$>
MTFLCFAssetタグ
アセット系(画像/オーディオ/ビデオ/ファイル)のフィールドを出力するには、「MTFLCFAsset」というテンプレートタグ(ブロックタグ)を使います。
fieldまたはnameモディファイアを使って、出力するフィールドの名前を指定します。また、MTFLCFAssetタグのブロックの中では、Movable Type標準のMTAsset系のテンプレートタグを使って、アセットの各種の情報を出力することができます。
例えば、前述の例のように、カスタムフィールドのテンプレートタグ名を「EntryFLCF」にしたものとします。また、このカスタムフィールドに「image」という名前の画像型のフィールドを定義したとします。この場合、このimageフィールドの画像のURLを出力するには、以下のようにテンプレートを組みます。
imageフィールドの画像のURLを出力
<mt:EntryFLCFBlock>
・・・
<mt:FLCFAsset field="image">
<$mt:AssetURL$>
</mt:FLCFAsset>
・・・
</mt:EntryFLCFBlock>
MTFLCFIfUnitNameタグ
ユニット機能を使う場合、ユニットの種類によって、値の出力方法を変えることになります。そこで、ユニットの種類で条件判断するテンプレートタグとして、「MTFLCFIfUnitName」というブロックタグがあります。nameモディファイアを使って、判断するユニットの名前を指定します。
例えば、以下のような状況だとします。
①カスタムフィールドのテンプレートタグ名を「EntryFLCF」にしたものとします。
②このカスタムフィールドに「u_header」「u_text」「u_image」の3つのユニットを定義したとします。
この場合、ユニットの種類によって出力を分けるには、以下のようにテンプレートを組みます。
MTFLCFIfUnitNameタグでユニットごとに出力を分ける
<mt:EntryFLCFBlock>
・・・
<mt:FLCFIfUnitName name="u_header">
u_headerユニットの場合の出力
</mt:FLCFIfUnitName>
<mt:FLCFIfUnitName name="u_text">
u_textユニットの場合の出力
</mt:FLCFIfUnitName>
<mt:FLCFIfUnitName field="u_image">
u_imageユニットの場合の出力
</mt:FLCFIfUnitName>
・・・
</mt:EntryFLCFBlock>
MTFLCFCountタグ
フィールドの組み合わせやユニットを複数回入力できるようにしている場合(同一フィールド群の複数回追加の「同一フィールド群の複数回追加の概要」を参照)、MTFLCFCountタグで、その個数を出力することができます。
例えば、カスタムフィールドのテンプレートタグ名を「EntryFLCF」にした場合、そこに入力したフィールドの組み合わせ(またはユニット)の個数は、以下のように出力することができます。
フィールドの組み合わせ(またはユニット)の個数を出力
<mt:EntryFLCFBlock>
<$mt:FLCFCount$>
</mt:EntryFLCFBlock>
MTFLCFOptionsタグ/MTFLCFOptionValueタグ/MTFLCFIfOptionSelectedタグ
セレクト型のフィールドで、選択肢の一覧を出力したいときには、「MTFLCFOptions」というブロックタグを使います。fieldまたはnameモディファイアで、フィールドの名前を指定します。
このブロックの中では、個々の選択肢の送信値/表示値を、それぞれMTFLCFOptionValue/MTFLCFOptionLabelのファンクションタグで出力することができます。また、個々の選択肢が選択されているかどうかを判断するには、MTFLCFIfOptionSelectedというブロックタグを使います。
例えば、「sel」というフィールドの送信値/表示値を順に出力し、また選択されている選択肢には「○」の記号を出力したい場合、以下のようにテンプレートを組みます。
MTFLCFOptionsタグの例
<mt:FLCFOptions field="sel">
<mt:If name="__first__"><ul></mt:If>
<li>送信値 = <$mt:FLCFOptionValue$>, 表示値 = <$mt:FLCFOptionLabel$>, 選択 = <mt:FLCFIfOptionSelected>○</mt:FLCFIfOptionSelected></li>
<mt:If name="__last__"></ul></mt:If>
</mt:FLCFOptions>
フィールドの値による条件判断
フィールドの値で条件判断して出力方法を変えたい場合、MTIfタグを以下のように書きます。「比較用モディファイア」のところには、MTIfタグで使える比較用の各種のモディファイアを指定します(eqやgtなど)。
フィールドの値で出力を変える
<mt:If tag="FLCFValue" field="フィールド名" 比較用モディファイア="値">
条件を満たしているときに出力する内容
<mt:Else>
条件を満たしていないときに出力する内容
</mt:If>
例えば、「sel」というフィールドの値が「tokyo」であるかどうかで出力を分けたいときには、以下のようにテンプレートを組みます。
「sel」フィールドの値が「tokyo」であるかどうかで出力を分ける
<mt:If tag="FLCFValue" field="sel" eq="tokyo">
「sel」というフィールドの値が「tokyo」のときに出力する内容
<mt:Else>
「sel」というフィールドの値が「tokyo」でないときに出力する内容
</mt:If>
その他のテンプレートタグ
ここまでに解説した以外に、「MTFLCFRawValue」と「MTFLCFUnitName」というテンプレートタグもあります。
MTFLCFRawValueタグは、フィールドの生の値を出力するファンクションタグです。MTFLCFValueタグでは、フィールドのタイプによって出力を調整していますが、MTFLCFValueタグではその調整を行いません。
また、MTFLCFUnitNameタグは、ユニットを使っている場合に、個々のユニットの名前を出力します。