a-blog cms で行う3つテンプレートの条件分岐
これは a-blog cms Advent Calendar 2022 1日目の記事です。
今回は公式ドキュメントには書かれていない応用Tipsを含めて、a-blog cms のさまざまな条件分岐方法をご紹介します。
タッチモジュール、インクルード機能、IFブロックについてご紹介しています。
目次
方法その1: タッチモジュール
タッチモジュールで囲まれた箇所は、現在閲覧しているページが条件に一致したときだけ表示されます。
公式テーマでは、例えば管理ボックスなどのログイン時のみ表示したいUIの表示を制御するために使用されています。
<!-- BEGIN_MODULE Touch_Login --> このテキストはログイン時のみ表示されます <!-- END_MODULE Touch_Login --> <!-- BEGIN_MODULE Touch_Unlogin --> このテキストはログアウト時のみ表示されます <!-- END_MODULE Touch_Unlogin -->
読者・投稿者・編集者・管理者などの細かい権限の単位でタッチモジュールが用意されているので、会員制サイトを作るときや運用者用により使いやすく管理画面をカスタマイズしたい時に使いやすいモジュールです。
ログイン・ログアウトや権限などのユーザーの状態だけではなく、トップページのときやカテゴリーページなどの現在表示している情報を元に条件を分岐することができます。
タッチモジュールを使いたいときは、公式ドキュメントで利用したい条件があるかどうか確認しましょう。
タッチモジュールで行う条件分岐の特徴
- 公式リファレンスからスニペットをコピペするだけで使用できる
- 単純な機能なため比較的シンプルに利用できる
- デフォルトで用意されている条件が扱える
方法その2: インクルード機能
インクルード文とグローバル変数を使い、表示するテンプレートを分岐することが可能です。
a-blog cms の公式テーマでは、管理画面で使用しているカスタムフィールドを条件分岐するために使用されています。
分岐する際は、以下のようにインクルード文を記述します。
@include("/admin/entry/ccd/%{CCD}.html")
この時、カテゴリーコードが「recruit」のカテゴリーを閲覧してる場合は、/admin/entry/ccd/recruit.htmlが読み込まれ、テンプレートが存在していればページ上に表示されます。
上記の例では%{CCD}を使用していますが、ブログ単位で表示内容を分ける場合は%{BCD}、エントリー単位で分ける場合は%{ECD}を使用します。
@include("/admin/entry/bcd/%{BCD}.html") @include("/admin/entry/ecd/%{ECD}.html")
グローバル変数の出力結果に関しての詳細は、デベロッパーサイトをご覧ください。
仕組みの解説
インクルード機能とグローバル変数は、グローバル変数の方が実行順序が早く、インクルード機能が実行されるよりも前にグローバル変数の値が出力されるため、意図したテンプレートが読み込まれ利用できます。
たとえばEntry_Summaryなどのモジュールで使用している変数(例:{ecd}など)を使用した場合、インクルードよりも実行順序が遅いため、以下のようなコードはテンプレートは読み込まれず、利用できません。
インクルードを利用できない例
<!-- BEGIN_MODULE Entry_Summary --><!-- BEGIN unit:loop --><!-- BEGIN entry:loop --> @include("/admin/entry/ccd/{ecd}.html") <!-- END entry:loop --><!-- END unit:loop --><!-- END_MODULE Entry_Summary -->
実行順序に関しては、詳しくは以下のデベロッパーサイトのドキュメントをご覧ください。
注意:使用できるグローバル変数の制限について
また、a-blog cms Ver.3.0以降ではインクルードに使用できるグローバル変数に制限があるので注意する必要があります。
正確にはテンプレートキャッシュを有効にしている時に制限が発生します。
しかし、メンテナンスの面では無効でも有効でも同じように動作する方が無難だと思いますので、テンプレートキャッシュの利用を考えていなくても対応するグローバル変数を使用する方がいいでしょう。
インクルードに使用できるグローバル変数の一覧(Ver.3.0以降)
Ver. 3.0以降は以下のグローバル変数がインクルードに使用できます。IDを出力するグローバル変数は対象外となっているため、お気をつけください。
- %{ECD}
- %{BCD}
- %{PBCD}
- %{RBCD}
- %{CCD}
- %{PCCD}
- %{RCCD}
- %{ALIAS_CODE}
- %{IS_ADMIN}
- %{MODULE_NAME}
- %{MODULE_ID}
- %{ADMIN_PATH}
- %{ADMIN_PATH_MID}
インクルード機能で行う条件分岐の特徴
- インクルードに使用許可されているグローバル変数を基準に、条件を分けることができる
- タッチモジュールよりもより細かく、特定の単位(例えば、採用情報カテゴリーなど)で用意できる
- 読み込むファイルごと分岐するので、一部分(例:会員限定ラベルを表示するなど)の分岐であれば余分にファイル数が増えてしまう可能性はあります
方法その3: IFブロック
IFブロックは今回ご紹介する条件分岐方法の中で、群を抜いて柔軟性があります。
例えば、以下のようなことが可能です。
- 変数やブロックなどを基準にして条件を定めることができる
- 演算子を使用できる
- ELSEやELSE_IFを指定できる
などなど、活用方法は多岐にわたります。
使用方法は、以下のようにIFブロックを記述します。
<!-- BEGIN_IF [%{KEYWORD}/nem] --> キーワードがあるときのみ、このテキストが表示されます。 <!-- END_IF -->
詳細は、IFブロックの公式ドキュメントをご覧ください。
ELSE_IFとELSEが設定できるのも特徴の一つです。以下のように記述します。
<!-- BEGIN_IF [%{KEYWORD}/eq/ホットケーキ] --> キーワードが「ホットケーキ」だったときのみ、このテキストが表示されます。 <!-- ELSE_IF [%{KEYWORD}/eq/パンケーキ] --> キーワードが「パンケーキ」だったときのみ、このテキストが表示されます。 <!-- ELSE --> キーワードが「ホットケーキ」でも「パンケーキ」でもないとき、このテキストが表示されます。 <!-- END_IF -->
IFブロックの応用その1:グローバル変数や変数と合わせて使う
よくみられる使用例は、グローバル変数と組み合わせて使う方法です。
<!-- BEGIN_IF [%{KEYWORD}/nem] --> キーワードがあるときのみ、このテキストが表示されます。 <!-- END_IF -->
また、IFブロックの特徴として、変数を条件分岐の条件として利用することができます。
インクルード機能ではグローバル変数しか利用できなかったのですが、IFブロックは実行順序が遅いため、変数を条件分岐の条件として利用することができます。
例えば、カスタムフィールドの変数があったら特定のテキストを表示する、といった実装が可能になります。
<!-- BEGIN_MODULE Blog_Field --> <!-- BEGIN_IF [{custom_field_test}/nem] --> {custom_field_test}に値があれば、このテキストが表示されます <!-- END_If --> <!-- END_MODULE Blog_Field -->
IFブロックの応用その2:ブロックと合わせて使う
記入方法の工夫次第では、 ブロックを条件分岐の条件として利用する ことができます。
以下は、Entry_BodyモジュールのformBodyブロックを例にしたソースコードです。
<!-- BEGIN_MODULE Entry_Body --> <!-- BEGIN_IF [<!-- BEGIN formBody -->1<!-- END formBody -->/eq/1] --> formBodyブロックが実行されたときのみ、このテキストが表示されます <!-- END_IF --> <!-- END_MODULE Entry_Body -->
※IFブロックの条件に記入している 「1
」はブロックが有効かどうかを判定しているだけなので特別な意味はありません。どんな文言でも構いません。
IFブロックの応用その3:loopブロックと合わせて使う
loopブロックを元に条件分岐をしたい場合は、以下のように記述することで対応できます。
以下は、Entry_Summaryモジュールのentry:loopブロックを例にしたソースコードです。
<!-- BEGIN_MODULE Entry_Summary --> <!-- BEGIN_IF [<!-- BEGIN unit:loop --><!-- BEGIN entry:loop -->1<!-- END entry:loop --><!-- END unit:loop -->/eq/1] --> ループが実行されるときのみ、このテキストが表示されます <!-- END_IF --> <!-- END_MODULE Entry_Summary -->
IFブロックは実行順序が遅いという特徴から、ブロックやloopブロックを条件分岐に含めることもできます。ですが、そもそも条件に含めることを知らなかったり、頭から抜けてしまいがちです。
ブロックと組み合わせることで、今までできなかったことが実現できるようになるかもしれませんので、実装の際はブロックまで視野を拡げて実装していただけたらと思います。
IFブロックの条件分岐の特徴
- ELSEやELSE_IFなどの条件を付けられるので、柔軟に対応できる
- インクルード機能と異なり、すべてのグローバル変数を条件に含むことができる
- インクルード機能と異なり、グローバル変数意外にも変数を条件に含むことができる
- ブロックやループブロックを条件に含むことができる
まとめ
今回は条件分岐する機能として、大きく分けて3つご紹介させていただきました。
私が実装を考える時は、大体以下の条件で機能を使い分けています。
機能名 | 使い分ける条件 |
---|---|
タッチモジュール | ・ソースコード量が少なく、ファイルで分けたくないとき ・特定の条件にまつわるもの(ログインや、ユーザーの権限など) |
インクルード機能 | ・ソースコード量が多く、ファイルで分けたいとき ・グローバル変数が用意されているもの(カテゴリーコードやブログコードなど) |
IFブロック | ・ソースコード量が少なく、ファイルで分けたくないとき ・演算子を使いたいとき ・ELSE_IFでしか条件を指定できないとき ・ブロックやloopブロックを条件分岐に含めたいとき |
いろいろとご紹介いたしましたが、要望に沿うことができることはもちろんですが、メンテナンスしやすいソースコードをなるべく保てることが理想ではないかと思っております。
本記事が制作中のプロジェクトにとってどの手段が最適なのかご判断いただく一助になれば幸いです。
明日の a-blog cms Advent Calendar 2022 2日目は菅原彩さんです!