2.4.x系 ヘッダーとフッターにログアウトボタンを設置/ヘッダーとフッターをブロック化する

ログイン・ログアウトはデフォルトだとblocとして用意されているのですが、
一般的な使い方としては、マイページだったり、商品ページだったり、
色んな場所でログイン・ログアウトはできて欲しいところ。

なので、ヘッダーとフッターにあるであろう、
ナビゲーションリンクからも、ログアウトできるようにしちゃいましょう。

今回はログアウトリンクを設置、会員登録リンクと変更できるような感じにします。


2.11.x系についてはこちらもあわせて参照ください。

[EC-CUBE]2.11.1 ヘッダーやページ内などブロック以外の場所にログアウトボタンを設置する
http://d.hatena.ne.jp/AI-615/20110617/1308295484

[EC-CUBE]2.11.0系でブロックやテンプレートから別のテンプレートファイルやphpファイルをincludeで呼び出す
http://d.hatena.ne.jp/AI-615/20110407/1302161660

手順1 site_main.tplからブロック化したphpを呼ぶ準備をする

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

↓ を

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

へ変更します。

手順2 上で呼び出しているheader.phpをつくる

html/frontparts/bloc
へ、header.phpを新規作成。中には以下のソースをペタり。

<?php
/*
 *   HEADER CLASS 
 */
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();
?>

手順3 呼び出しているLC_Page_FrontParts_Bloc_Header_Exをつくる

html/class_extends/page_extends/frontparts/bloc/
へ、LC_Page_FrontParts_Bloc_Header_Exを新規作成。
中には以下のソースをペタリ。

<?php
/*
 *   HEADER CLASS 
 */
 
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();
    }

}
?>

手順4 呼び出しているLC_Page_FrontParts_Bloc_Headerをつくる

html/class/pages/frontparts/bloc/
へ、LC_Page_FrontParts_Bloc_Headerを新規作成。
中には以下のソースをペタリ。
ここでようやくログイン情報を取得する為の記述がでてきました。

<?php
/*
 *  HEADER CLASS 
 */

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;
    }

}
?>

手順5 tplファイルを呼び出せるようにする

手順4で$bloc_fileで指定しているtplファイルを作成します。
今回はhtml/data/Smarty/templates/default/bloc/
へheader.tplを作成します。
中身は現在使用されているheader.tplをコピーしたもので構いません。
そこへ、以下のようにログアウトのリンクを記述します。

<a href="<!--{$smarty.server.PHP_SELF|escape}-->" onclick="fnFormModeSubmit('login_form', 'logout', '', ''); return false;">ログアウト</a>

会員登録のリンクと切り替える場合は、こんな感じ

<!--{if $tpl_login}-->
<a href="<!--{$smarty.server.PHP_SELF|escape}-->" onclick="fnFormModeSubmit('login_form', 'logout', '', ''); return false;">ログアウト</a>
<!--{else}-->
<a href="<!--{$smarty.const.URL_DIR}-->entry/kiyaku.php">会員登録</a><!--{/if}-->

手順6 管理画面から作成したtplファイルを編集できるようにする

このままだと、管理画面のデザイン管理から
作成したtplを編集することが出来ません。
なので、指してるパスを変えてあげましょう。
LC_Page_Admin_Design_Header.php内、function process()以下

            // 登録時はプレビュー用テンプレートをコピーする
            if ($_POST['mode'] == 'confirm'){
                copy($pre_DIR.$division.".tpl", USER_PATH . USER_PACKAGE_DIR . TEMPLATE_NAME . "/" . $division . ".tpl");

            // 登録時はプレビュー用テンプレートをコピーする
            if ($_POST['mode'] == 'confirm'){
            if($division == "header"){
                copy($pre_DIR.$division.".tpl", USER_TEMPLATE_PATH . TEMPLATE_NAME . "/" . BLOC_DIR . $division . ".tpl");
            }else{
                copy($pre_DIR.$division.".tpl", USER_PATH . USER_PACKAGE_DIR . TEMPLATE_NAME . "/" . $division . ".tpl");
			}

もう一カ所直します。

            // ユーザーパスにテンプレートが存在しなければ,
            // 指定テンプレートから読み込む
            $header_tpl = USER_PATH . USER_PACKAGE_DIR . TEMPLATE_NAME . "/" . "header.tpl";

            // ユーザーパスにテンプレートが存在しなければ,
            // 指定テンプレートから読み込む
			$header_tpl = USER_TEMPLATE_PATH . TEMPLATE_NAME . "/" . BLOC_DIR . "header.tpl";


これでHeaderのブロック化ができました!
Footerもおんなじように作ってあげるとうごくよ!