2021年11月05日
「テンプレートタグ」を使って、出力し、分岐し、加工する
PowerCMS は 10 年を超える歴史があり、本当に様々なお客様にご利用いただいております。リリース当初からのベテランのお客様もいらっしゃいますし、制作業務の選択肢に PowerCMS を入れていただいたばかりのお客様もいらっしゃいます。PowerCMS 製品サポートでは、日々のやりとりの中からお客様のリテラシーを読み取り、最適なご案内ができるよう努めておりますが、実は基礎的なことほど、改めてご説明するのが難しいことがあります。そのひとつが「テンプレートタグ」です。
テンプレートタグは、プログラミングなしに大規模かつ複雑な制作を行うことができる強力な武器となりえます。この記事では、PowerCMS の初学者のお客様が、「テンプレートタグ」とは何か、どう使うものなのかをご理解いただけるよう解説します。
テンプレートタグとは
PowerCMS は、入力された記事やウェブページの情報を、あらかじめ作成しておいたテンプレートに当てはめてページを生成します。テンプレートの中で、どこになにを出力する、ということを定義するのが「テンプレートタグ」です。
テンプレートタグを使って「出力する」
例えば、記事アーカイブテンプレートで、下記のような記述を行ったとします。
<h1><MTEntryTitle></h1>
<div>
<MTEntryBody>
</div>
この場合、h1 要素の内容として記事のタイトルが、div 要素の内容として記事の本文が出力されます。MTEntryTitle
や MTEntryBody
のような、内容を出力するタグを「ファンクションタグ」といいます。
ループ出力する
新着情報として、新しく追加された記事 5 件のタイトルを表示したい、といった場面があるでしょう。こういった場面では、「ブロックタグ」を使うことで、囲んだ内容を繰り返すことができます。
<h1>新着情報</h1>
<ul>
<MTEntries lastn="5">
<li><MTEntryTitle></li>
</MTEntries>
</ul>
上記では、ブロックタグ MTEntries
を使い、新しい記事から 5 件分のタイトルを li 要素の内容として出力しています。このように、囲んだ内容を繰り返すことを「ループする」とか「ループ処理する」などと呼ぶことがあります。
テンプレートタグを使って「分岐する」
テンプレートタグでは、囲んだ内容を、特定の条件を満たした場合のみ出力させる、といったことも可能です。このようなテンプレートタグを「条件タグ」と呼ぶことがあります。
<h1>新着情報</h1>
<ul>
<MTEntries lastn="5">
<li><MTEntryTitle><MTIfCommentsAccepted>(コメント投稿できます)</MTIfCommentsAccepted></li>
</MTEntries>
</ul>
上記の例では、記事がコメントを受け付けているかどうかを分岐する条件タグ MTIfCommentsAccepted
を使って、コメントを受け付けている場合のみ「(コメント投稿できます)」というテキストを出力しています。
また、下記のように、MTElse
タグと組み合わせると、コメント投稿を受け付けていない場合には「(コメント投稿できません)」と出力することも可能です。
<h1>新着情報</h1>
<ul>
<MTEntries lastn="5">
<li><MTEntryTitle><MTIfCommentsAccepted>(コメント投稿できます)<MTElse>(コメント投稿できません)</MTIfCommentsAccepted></li>
</MTEntries>
</ul>
特定の条件を満たす場合のことを「真である」、逆に満たさない場合のことを「偽である」と表現します。上記では、MTIfCommentsAccepted
が偽の場合に「(コメント投稿できません)」を出力しています。
テンプレート変数
このセクションは、本記事の中で最も重要です。
テンプレートでは、変数を扱うことができます。変数とは、データに名前をつけておくことで、あとでその内容を取り出せるようにする仕組みです。テンプレートの中で使うことができる変数を「テンプレート変数」と呼びます。
下記では、一行目でテンプレートタグ MTSetVar
を使ってデータ「NEW!」に「new_label」という名前をつけておき、二行目でテンプレートタグ MTVar
を使って「new_label」のデータを取り出した結果、このテンプレート全体では [NEW!]
と出力されます。
<MTSetVar name="new_label" value="NEW!">
[<MTVar name="new_label">]
データに名前をつけることを「代入」といい、上記では「テンプレート変数『new_label』に『NEW!』を代入する」と表現します。ニュアンスを合わせた表現にするなら、変数とは、「new_label」という名前の入れ物に「NEW!」というデータを入れておくこと、ということもできるでしょう。
これだけではあまり意味がありませんが、例えば、「記事がカテゴリー『新着情報』か『重要なお知らせ』に属している場合に『[NEW!]』と表示する」ことを考えてみましょう。カテゴリーに属するかどうかの判定は、条件タグ MTIfCategory
を使います。インデントをつけると読みやすくなるでしょう。
<h1>新着情報</h1>
<ul>
<MTEntries lastn="5">
<MTSetVar name="new_label" value="">
<MTIfCategory name="新着情報">
<MTSetVar name="new_label" value="[NEW!]">
</MTIfCategory>
<MTIfCategory name="重要なお知らせ">
<MTSetVar name="new_label" value="[NEW!]">
</MTIfCategory>
<li><MTVar name="new_label"><MTEntryTitle></li>
</MTEntries>
</ul>
MTIfCategory
では2つのカテゴリーを同時に判定することができないので、ひとつずつチェックしていきます。最初に「new_label」を空にしていますが、2つの MTIfCategory
のどちらか一方が真であれば、テンプレート変数「new_label」に「[NEW!]」が代入されるので、その結果、記事タイトルの前の <MTVar name="new_label">
で「[NEW!]」が出力されるようになります。どちらのカテゴリーにも属さない場合は、記事タイトルだけが出力されます。
より好ましいテンプレート記述
しかし、上記では、「[NEW!]」の代わりに「★」を出力することになった場合、二箇所の MTSetVar
タグをぞれぞれ修正する必要があり、好ましい記述とはいえません。条件タグ MTIfCategory
が真であった場合に代入するのはフラグのみとし、フラグが真であった場合に「★」を出力する、と考えるのがよいでしょう。テンプレート変数の判定には、条件タグ MTIf
を使います。
<h1>新着情報</h1>
<ul>
<MTEntries lastn="5">
<MTSetVar name="is_new" value="">
<MTIfCategory name="新着情報">
<MTSetVar name="is_new" value="1">
</MTIfCategory>
<MTIfCategory name="重要なお知らせ">
<MTSetVar name="is_new" value="1">
</MTIfCategory>
<li><MTIf name="is_new">★</MTIf><MTEntryTitle></li>
</MTEntries>
</ul>
このようにすれば、「★」を「[NEW!]」に戻すときも、修正箇所は一箇所で済みます。
予約変数
ここまでのテンプレートタグでは、自分でテンプレート変数を代入し、取り出して使用してきました。これに対して、デフォルトでセットされているテンプレート変数もあります。これを「予約変数」といいます。
テンプレート変数○○がデフォルトでセットされていることを、「テンプレート変数○○が使える」と表現し、<MTVar name="○○">
のように取り出したり、
<MTIf name="○○">
テンプレート変数○○が真の場合に出力する
<MTElse>
テンプレート変数○○が偽の場合に出力する
</MTIf>
のように分岐したりすることができます。
モディファイアを使って「加工する」
テンプレートタグには、モディファイアという仕組みがあります。<MTEntries lastn="5">
では、lastn
がモディファイアです。
モディファイアはそのはたらきによって大きく二種類に分けられます。上記の lastn
モディファイアは、ブロックタグ MTEntries
を補助するはたらきがあり、最新のものから 5 件の記事をループ出力の対象にするものです。
これに対して、出力内容を加工するはたらきをもつモディファイアがあります。これを「グローバル・モディファイア」と呼びます。例えば、下記のように words
モディファイアを指定すると、記事タイトルを先頭から 10 文字出力するようになります。
<h1>新着情報</h1>
<ul>
<MTEntries lastn="5">
<li><MTEntryTitle words="10"></li>
</MTEntries>
</ul>
リファレンス
この記事でご紹介したテンプレートタグやグローバル・モディファイアはたくさんのものがあり、リファレンスが公開されております。ぜひご参照ください。
- カテゴリー
- PowerCMS 5
- 技術情報
コメントを投稿する