EC-CUBEのヘッダテンプレートをシステムのプロパティによって切り替える

Web上で簡単にECシステムを構築出来るEC-CEBE。
ブロックで用意出来る箇所はPHPで変数やプロパティを設定してテンプレートからSmartyを介して参照すれば良いけどヘッダとかフッタとかはデフォルトではテンプレートからテンプレートを直読みしてるから融通が聞きづらい。
なのでヘッダもブロックと同じようにPHPを噛ませて値をセットして参照出きるようにする。
今回は具体的にはユーザのログイン状態でヘッダのテンプレート出力内容を制御可能にする。


まずはインクルードするヘッダファイルを変更する。
ファイル:data/Smarty/templates/default/site_main.tpl

<!--{include file= $header_tpl}-->

<!--{include_php file="`$smarty.const.HTML_PATH`frontparts/bloc/header.php"}-->

に修正。


実行されるPHPファイルの処理を記述。
ファイル:html/frontparts/bloc/header.php

<?php
require_once(CLASS_EX_PATH . "page_extends/frontparts/bloc/LC_Page_FrontParts_Bloc_Header_Ex.php");

$objPage = new LC_Page_FrontParts_Bloc_Header_Ex();
register_shutdown_function(array($objPage, "destroy"));
$objPage->init();
$objPage->process();
?>


LC_Page_FrontParts_Bloc_Headerを継承し大枠の処理を記述したクラスを作成。
ファイル:data/class_extends/page_extends/frontparts/bloc/LC_Page_FrontParts_Bloc_Header_Ex.php

<?php
require_once(CLASS_PATH . "pages/frontparts/bloc/LC_Page_FrontParts_Bloc_Header.php");

class LC_Page_FrontParts_Bloc_Header_Ex extends LC_Page_FrontParts_Bloc_Header {

    /**
     * Page を初期化する.
     *
     * @return void
     */
    function init() {
        parent::init();
    }

    /**
     * Page のプロセス.
     *
     * @return void
     */
    function process() {
        parent::process();
    }

    /**
     * デストラクタ.
     *
     * @return void
     */
    function destroy() {
        parent::destroy();
    }

}
?>


LC_Page_FrontParts_Blocを継承した実処理を記述したクラスを作成。
ファイル:data/class/pages/frontparts/bloc/LC_Page_FrontParts_Bloc_Header.php

<?php
require_once(CLASS_PATH . "pages/frontparts/bloc/LC_Page_FrontParts_Bloc.php");

class LC_Page_FrontParts_Bloc_Header extends LC_Page_FrontParts_Bloc {

    /**
     * Page を初期化する.
     *
     * @return void
     */
    function init() {
        parent::init();
        $bloc_file = "header.tpl";
        $this->setTplMainpage($bloc_file);
        $this->tpl_login = false;
        $this->tpl_disable_logout = false;
    }

    /**
     * Page のプロセス.
     *
     * @return void
     */
    function process() {
        $objCustomer = new SC_Customer();
        // クッキー管理クラス
        $objCookie = new SC_Cookie(COOKIE_EXPIRE);

        // ログイン判定
        if($objCustomer->isLoginSuccess()) {
            $this->tpl_login = true;
            $this->tpl_user_point = $objCustomer->getValue('point');
            $this->tpl_name1 = $objCustomer->getValue('name01');
            $this->tpl_name2 = $objCustomer->getValue('name02');
        } else {
            // クッキー判定
            $this->tpl_login_email = $objCookie->getCookie('login_email');
            if($this->tpl_login_email != "") {
                $this->tpl_login_memory = "1";
            }

            // POSTされてきたIDがある場合は優先する。
            if($_POST['login_email'] != "") {
                $this->tpl_login_email = $_POST['login_email'];
            }
        }

        $this->tpl_disable_logout = $this->lfCheckDisableLogout();
        $objSubView = new SC_SiteView();
        $this->transactionid = $this->getToken();
        $objSubView->assignobj($this);
        $objSubView->display($this->tpl_mainpage);
    }

    /**
     * デストラクタ.
     *
     * @return void
     */
    function destroy() {
        parent::destroy();
    }

    function lfCheckDisableLogout() {
        $masterData = new SC_DB_MasterData_Ex();
        $arrDISABLE_LOGOUT = $masterData->getMasterData("mtb_disable_logout");
        $nowpage = $_SERVER['PHP_SELF'];

        foreach($arrDISABLE_LOGOUT as $val) {
            if($nowpage == $val) {
                return true;
            }
         }
        return false;
    }

}
?>


最後にヘッダテンプレート内にて「LC_Page_FrontParts_Bloc_Header.php」で設定した「$tpl_login」の値で処理を分岐してやれば完了。
ファイル:html/user_data/packages/default/bloc/header.tpl

<!--{if $tpl_login}-->
<!--ここにログイン時のテンプレートを記述-->
<!--{else}-->
<!--ここにログアウト時のテンプレートを記述-->
<!--{/if}-->

上記テンプレートファイルの編集だけはブラウザ上の管理画面から行う。(ファイル直いじりでもいいですが)
ブロックの一つとしてヘッダテンプレートを編集する形が多少気持ち悪いけどそこはデザイナさんが編集しますので。


フッタのテンプレート切り替えは上記とほぼ同様に可能なはず。
もちろんログイン状態以外にもさまざなプロパティの参照や出力も可能。


参考記事は以下になります。