TouchモジュールでなくIFを使っていこう

a-blog cms Advent Calendar 2016の16日目の記事になります。
1系から使っている開発者の方は「Touchモジュール」を便利に使ってきたと思いますが、
「ifでできるものはそちらに移行した方が良い」と思います、という内容です。

Touchモジュールとは何か

公式ページのこちらに、詳細が掲載されています。
https://developer.a-blogcms.jp/reference/latest/touch.html

Touchモジュールは「ある特定の条件で、囲んだ部分の内容を表示する」というモジュールだと理解しています。
サイト構築をしていると、お客様のサービスによっては、特定の条件を満たす人だけに特別な情報を表示したい、ということがあります。

例えば
「サイトにログインしている人にだけは、申し込みボタンを表示したい」とか。
あるいはその逆で
「サイトにログインをしていない人には、会員登録を促したい」
というケースもあると思います。

上のような表現をa-blog cmsで行うにはどうしたらいいでしょう。
まずはTouchモジュールを使って表現します。

ログインしている人にだけ、表示をしたい(Touch_Login)

<!-- BEGIN_MODULE Touch_Login -->
ここに申し込みボタンなどのコードを記載
<!-- END_MODULE Touch_Login -->

ログインしていない人にだけ、表示をしたい(Touch_Unlogin)

<!-- BEGIN_MODULE Touch_Unlogin -->
ここに会員登録を促す内容を記載
<!-- END_MODULE Touch_Unlogin -->

上記のようになります。
このカスタマイズのポイントは「Touch_Login」と「Touch_Unlogin」がスイッチの「ON、OFF」のように動く、ということです。
どちらかに該当する場合ものだけが表示されます。

Touchモジュールは条件に該当するとき「だけ」表示されるので、該当しない場合は何も出力されません。

IF文を使ってサイトへのログイン、非ログインの場合の表示制御をする

結果からいうとこんな感じになります。

<!-- BEGIN_IF [%{SESSION_USER_ID}/nem/] -->(セッションユーザ名が空の場合=ログインしていない場合)
ここに会員登録を促す内容を記載(ログインしてないユーザ向けの情報)
<!-- ELSE -->
ここに申し込みボタンなどのコードを記載(ログイン済みユーザ向けの情報)
<!-- END_IF -->

となります。

IFで書く場合は条件設定をする必要があります
条件はモジュールの変数なども利用できますが、今回はグローバル変数でログインを判別する必要があります。

グローバル変数についてはこちらに詳細が記載されています。
https://developer.a-blogcms.jp/reference/latest/global_variable.html

if文で表現をする際のポイント

Touchモジュールを使う場合は「条件と表示」が1セットになっているので、ぱっと探して使いやすくなっています。
これをIFで書こうとすると

・条件をどのように表現するか
・処理する順番を設計する


を考慮する必要があります。
そのため上記の条件だけであれば、Touchモジュールを使った方が実装としては「お手軽」です。

なぜ「IF」で書いた方が良いのか。

実装をシンプルに簡単にするには、Touchモジュールの方が正しいように一見見えます。
しかし、サイトの成長やカスタマイズの拡張を考えると「最初からIFで書いておいた方が、あとあと楽になる」ケースもあります。

ログイン以外にも更に条件を加えて、表示の分岐をしなければいけなかったケース

<!-- BEGIN_IF [%{SESSION_USER_ID}/nem/_or_/%{RID}/eq/36/_and_/%{DATE_YEAR}/em/] --><!-- 管理者の場合 -->
<!--#include file="index_party.html"--> 
<!-- ELSE_IF [%{SESSION_USER_ID}/nem/_or_/%{RID}/eq/36] --><!-- 管理者で年月が指定された場合 -->
<!--#include file="index_party_month.html"--> 
<!-- ELSE_IF [%{DATE_YEAR}/nem/_and_/%{RID}/nem/] --><!-- 一般の場合 -->
<!--#include file="index_customer.html"--> 
<!-- ELSE_IF [%{DATE_YEAR}/em/_and_/%{RID}/nem/] --><!-- 一般の場合で年月が指定された場合 -->
<!--#include file="index_customer_month.html"-->
<!-- ELSE --><!-- それ以外 -->

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<HTML>
<HEAD>
<TITLE></TITLE>
<meta http-equiv="refresh" content="0;URL=http://サービスのドメイン">
</HEAD>
</BODY>
</HTML>

<!-- END_IF -->

とある仕事のカスタマイズで書いたIF文をほぼそのまま掲載しております。
上記の場合は

「ログインしていて、さらにルールIDが特定の場合」であったり
「その上で年でエントリーがフィルタリングされている場合」

のようなかなり事細かい条件分岐を行なっています。
こうなるとTouchモジュールでは賄いきれません。
最初からTouchモジュールでなくIF文で書く癖をつけることで。
こういった条件分岐に対してスッと対応できる頭の訓練と実装の準備ができるかと思います。

おまけ

https://developer.a-blogcms.jp/reference/latest/global_variable.html

こちらのサイトで「login」という文字でページ検索をしてみてください。
多分一つも文字列がヒットしないと思います。
(ログインという日本語だと7件ヒットします)

グローバル変数を探すときに、Touchモジュールの変数で「login」の文字列が使われているので「login」で検索したのですが。
検索にヒットしないので「あれ?ログインの判別はグローバル変数にないのかな」と思い込んで実装を進めていました。

ですが別の機会に上から下まで読み直すと。
「SESSION_USER_NAME」など「SESSION_」から始まる文字列が、目的を達成するキーとなるグローバル変数ではないですか。
TouchモジュールとIF文で条件を設定するための文言が異なるため、ちょっと苦労しました…というのが余談でした。