こんにちは。
職人見習いの高嶋です。

EC-Cubeのマルチテナント化のカスタマイズという過程で、EC-CUBE ホスト名毎に表示テンプレートを切り替える方法を
前回の記事で書きました。

今回はひとつのホスト名で扱う事を前提に、ログイン前は共通テンプレートで、ログイン後は各店舗用のテンプレートデザインで表示するという方法を書きたいと思います。

バージョンは2.11.x以降を対象とします。

店舗基本情報dtb_baseinfoというテーブルがあります。
このテーブルは本来単一テナント型の設計なので、プライマリーキーカラムのない1レコードのみが存在するテーブルです。
このテーブルをマルチテナント化する為に最低でも4つのカラムを追加します。

ALTER TABLE dtb_baseinfo ADD COLUMN shop_id INT UNSIGNED NOT NULL DEFAULT 0 PRIMARY KEY AUTO_INCREMENT AT FIRST; ## 店舗ID。プライマリー。
ALTER TABLE dtb_baseinfo ADD COLUMN template_pc VARCHAR(30) NOT NULL DEFAULT '';     ## PC用テンプレートコード格納カラム
ALTER TABLE dtb_baseinfo ADD COLUMN template_mobile VARCHAR(30) NOT NULL DEFAULT ''; ## 携帯用テンプレートコード格納カラム
ALTER TABLE dtb_baseinfo ADD COLUMN template_sp VARCHAR(30) NOT NULL DEFAULT '';     ## スマートフォン用テンプレートコード格納カラム

管理側のSHOPマスター画面の改修方法は割愛します。
複数個の店舗を登録・編集できるようにカスタマイズします。

その際に各店舗情報登録内容に下記を選択できる項目を追加してします。

  • PC用テンプレート
  • 携帯用テンプレート
  • スマートフォン用テンプレート

管理側>デザイン管理で設定されたテンプレートコードはdtb_templatesに格納されているのでそちらから引っ張ってセレクトボックスを作成します。

次に会員マスターに属店舗IDを持たせる必要がある為、以下のカラムを追加します。

ALTER TABLE dtb_customer ADD COLUMN shop_id int UNSIGNED NOT NULL DEFAULT 0 AFTER customer_id;

DB設計のカスタマイズが完了したら本題です。

1.ユーザーの会員登録時に、その会員はどの店舗に属させるのか

コンテンツの仕様ケースにより様々だと思いますが、とにかく会員登録でdtb_customerにデータを格納する際に属店舗IDも含めます。

2.会員がログインするとセッションに会員情報が格納される

$_SESSION['customer']

に対象となるdtb_customerのレコードが連想配列で格納されます。
つまり、店舗IDは

$_SESSION['customer']['shop_id']

で取得できる事になります。

3.テンプレートコードの切り替え

ログイン前は『default, mobile, sphone』、ログイン後はdtb_baseinfoに格納されたテンプレートコードでテンプレートの表示を行いたいとします。
data/require_base.php に以下の記述を行います。

if( @$_SESSION['customer']['shop_id'] ) ## ログイン後のテンプレート制御
{
 define('TEMPLATE_NAME', $_SESSION['customer']['template_pc']);
 define('MOBILE_TEMPLATE_NAME', $_SESSION['customer']['template_mobile']);
 define('SMARTPHONE_TEMPLATE_NAME', $_SESSION['customer']['template_sp']);
}
else ## ログイン前のテンプレート
{
 define('TEMPLATE_NAME', 'default');
 define('MOBILE_TEMPLATE_NAME', 'mobile');
 define('SMARTPHONE_TEMPLATE_NAME', 'sphone');
}

かなり内容を端折っていますので分かり辛いと思いますがご容赦下さい。

※この記事は、なかの人(piro556)が書いています。