最近とある用事で、初めて EC-CUBE をガリガリとカスタマイズしています。
始めに構造を理解するまではどうしても時間がかかりますが、ある程度理解してしまえば何とかなりそうな感触はつかめてきました。それなりに規模が大きいシステムなので、ソース解析には Vim + GLOBAL さまさまという感じですね。
せっかくの機会なので、よく使えそうな小ネタでもあればこちらに残していこうと思っています。
さて、ログインしている時としていない時でページの表示を切り替えたいっていう要望はどこでもありますよね。今回はそんな時に使える、ログイン状態のチェックをどのページでもできるようにする方法です。
なお、EC-CUBEは Ver 2.13.2の環境です。
カスタマイズ方法
EC-CUBE には、ログインの判定結果を tpl_login という変数にセットしているいくつかのページがデフォルトで存在します。
例えば、下記のようにソースを grep すると、tpl_login に値をセットしている箇所が見つかります。
[shell]
$ grep -rn "\$this\->tpl_login =" *
data/class/pages/products/LC_Page_Products_Detail.php:240: $this->tpl_login = true;
data/class/pages/frontparts/bloc/LC_Page_FrontParts_Bloc_Login.php:43: $this->tpl_login = false;
data/class/pages/frontparts/bloc/LC_Page_FrontParts_Bloc_Login.php:72: $this->tpl_login = true;
data/class/pages/shopping/LC_Page_Shopping_Payment.php:95: $this->tpl_login = ‘1’;
data/class/pages/shopping/LC_Page_Shopping_Confirm.php:129: $this->tpl_login = ‘1’;
data/class/pages/cart/LC_Page_Cart.php:200: $this->tpl_login = true;
[/shell]
上記は、名前からも察しがつくように、商品詳細ページ、ログインブロック、カートページ、・・・といった特定のページを表示する時に使われるクラスなのですが、これらのページでは変数 tpl_login にセットされたログインしているか(true)否か(false)の結果によって、次のようにテンプレート内の表示を切り分けることができます。
[php]
<!–{if $tpl_login}–>
ログイン中です。
<!–{else}–>
ログインしていません。
<!–{/if}–>
[/php]
さて、これを特定のページに限らずどのページからも使えるようにしてみましょう。
ページ表示する際に必ず呼び出される LC_Page という基底クラス LC_Page(data/class/pages/LC_Page.php)があります。その拡張クラスである LC_Page_Ex(data/class_extends/page_extends/LC_Page_Ex.php)に、次のようなコードを追加します。
[php]
public function init()
{
parent::init();
// ログイン判定
$objCustomer = new SC_Customer_Ex();
if ($objCustomer->isLoginSuccess() === true) {
$this->tpl_login = true;
}
}
[/php]
これで、どのページからも tpl_login にログイン判定結果がセットされるようになりました。
同様に LC_Page_Ex に処理を追加することで、全ページ共通で参照したい情報をセットしておくことが可能です。知っておくと役に立つ場面がありそうですね。
photo credit: Sean MacEntee via photopin cc