WEB

ECCUBE 会員情報を共有する(2系統と3系統)

盲点でした・・・

メインとなるデータベースのVIEWを作ればよかったのです。
ただし、2系と3系の項目の差は埋めなければなりません。

既存のdtb_customerは、とりま、別名にして退避。

create view dtb_customer as
select * from `maindatabase`.dtb_customer;

単純なselect文なので、挿入・更新も可能。

 

はっーー、無駄なことを・・・

 

以下、その作業工程・・・


ECCUBE3、4なら、↓こちらをもとに、共有可能だが、

EC-CUBEで複数DBで会員データを共通化する

今回は、ECCUBE2.17と、ECCUBE3のでの共有を試みる。

なお、ECCUBE2系統と、3系統では、
データベースの構造が変わっており、今回は、その加工を含めているが、
2系統同士であれば、DBの加工は不要で、
接続先の変更だけ、行えばよい。

***

接続先の変更

ECCUBE3は、doctrineを使っているので、上記のリンク先の通り、
/src/Eccube/Resource/doctrine/Eccube.Entity.Customer.dcm.yml
などに、
table: [店舗Aのデータベース名].dtb_customer
と、1箇所記述するだけで済むが、

 

ECCUBE2.17は、大量の書き換えが必要です。

とりま、’dtb_customer’を含むファイルをgrepしてみると、

/data/class/helper/SC_Helper_DB.php
/data/class/helper/SC_Helper_Customer.php
/data/class/helper/SC_Helper_CSV.php
/data/class/helper/SC_Helper_Purchase.php
/data/class/helper/SC_Helper_Mail.php
/data/class/pages/products/LC_Page_Products_Detail.php
/data/class/pages/entry/LC_Page_Entry_EmailMobile.php
/data/class/pages/regist/LC_Page_Regist.php
/data/class/pages/forgot/LC_Page_Forgot.php
/data/class/pages/admin/total/LC_Page_Admin_Total.php
/data/class/pages/admin/products/LC_Page_Admin_Products.php
/data/class/pages/admin/customer/LC_Page_Admin_Customer_Edit.php
/data/class/pages/admin/LC_Page_Admin_Home.php
/data/class/pages/mypage/LC_Page_Mypage_Favorite.php
/data/class/pages/frontparts/LC_Page_FrontParts_LoginCheck.php
/data/class/SC_CustomerList.php
/data/class/SC_Customer.php

 

うへ・・・

 

一応、汎用的に使えるように、config .phpの上位に、
define(‘extrenal_db’, ‘店舗Aのデータベース名’)を宣言し、
定数を頭に足します。

‘dtb_customer’ >> 置換 >> extrenal_db. ‘dtb_customer’

直書きだとあれなんで、全部、class_exに派生で制作してね。
(バージョンアップを考慮しないなら、超く書きでもいいけど)

また、上記には、テーブル項目の修飾として、
使われている箇所もあるけど、そこは書き換えなくても、動きました。

 

テーブル項目の差分

足りない項目を、ECCUBE3側に足します。
反対でもいいのですが、今回は、3系が運用中で、2系の追加なので。

  • mailmaga_flg >> smallint(6)
  • point >> decimal(10,0)
  • reminder >> smallint(6)

※パスワードが共有になるので、AUTH_MAGICは同じものにすること!!

 

さて、次の問題、、、

customer_id の割当て

2系は、シーケンスIDを別のテーブルで管理しているおり、
phpMyAdminで見ると、邪魔だから、なんとかスマートにできないか?
と、試行錯誤した↓、が割と役に立つ。

ECCUBE 2.13.x シーケンステーブル

 

実際、主キーcustomer_idにNULLを渡せば、
AutoIncの値がセットされるので、この辺を加工。

/data/class_ex/ehlper_ex/SC_Helper_Customer_Ex.php

public function sfEditCustomerData($arrData, $customer_id = null)内


            // 新規登録
// 2021-12-10 * ECCUBE3系の時、NULLで挿入。insert後、Auto_INCの値を取得。
if (preg_match('/2.\d+/', ECCUBE_VERSION)) {
            // 会員ID取得 * 2系のときだけ
            $customer_id = $objQuery->nextVal('dtb_customer_customer_id');
            $arrData['customer_id'] = $customer_id;
}
            // 作成日
            if (is_null($arrData['create_date'])) {
                $arrData['create_date'] = 'CURRENT_TIMESTAMP';
            }
// 2021-12-10
            $objQuery->insert(extrenal_db. 'dtb_customer', $arrData);
if (!preg_match('/2.\d+/', ECCUBE_VERSION)) {    // https://www.projectgroup.info/tips/MySQL/SQL/SQL000003.html
            // 会員ID取得 * 3系のときだけ
			$customer_id = mysql_insert_id();
//var_dump(array('customer_id' => $customer_id));
}

ECCUBEのバージョンごとに、配慮し、条件文を追加し、
2系統以外は、customer_id = NULLで、処理し、

if (preg_match('/2.\d+/', ECCUBE_VERSION)) {
(略)
}

戻り値に、customer_idを利用するようなので、
2系統以外では、Auto_Incで追加された値を、
mysql_insert_id() にて、拾う。

if (!preg_match('/2.\d+/', ECCUBE_VERSION)) {
(略)
}

 

※ECCUBE3には、メルマガの機能がなく、
プラグインで実装されますが、この機能の、連動できません。
※独自に組むか、しかない!

 

PS

まあ、こんなアホなことする方は、なかなかいないと思いますが、
上記で、理解できない方は、
バージョン統合するのが、よろしいです!!

 

-

ECCUBE3 会員仮登録のエラーページ修正

メールが実在するか、確認するために、
仮登録は、有効なのですが、

ECCUBEの場合、2回URLを踏むと、
NOT FOUNDのエラーページが表示されます。

なので、メール中に、

※一度クリックすると、URLは無効となりますので、
登録したメールアドレスとパスワードで、ログインしてみて下さい。
なお、登録から10分経過した場合も同様に、無効となりますので、
ログインできない場合は、再登録お願い致します。

 

と、記載しているのですが、読んでません・・・

 

しかし、

なんで「NOT FOUND」表示なんでしょうね?

不正アクセス対策なんでしょうが、ユーザーには不親切です!

 

デバッグモードでアクセスすると、

「既に会員登録が完了しているか、無効なURLです。」

と表示されるのに、、、

 

ということで、

ECCUBE3 仮登録 エラー表示

と、普通に表示されるようにします。

***

1. 仮登録時のエラー処理を変更

/src/Eccube/Controller/EntryController.php 188行目あたり

         if ($request->getMethod() === 'GET' && count($errors) === 0) {
            log_info('本会員登録開始');
            try {
                $Customer = $app['eccube.repository.customer']
                    ->getNonActiveCustomerBySecretKey($secret_key);
            } catch (\Exception $e) {
// 2021-02-18 * Not Found >>  エラー表示
//                throw new HttpException\NotFoundHttpException('※ 既に会員登録が完了しているか、無効なURLです。');
	            return $app->render('Entry/activate_failed.twig');
            }

throw new HttpException\NotFoundHttpException … を無効にし、
return $app->render(‘Entry/activate_failed.twig’); twigを表示。

 

2. 上記で表示されるtwigを作成(編集)

/app/template/default/Entry/activate_failed.twigを作成
※activate.twigを丸コピーし、中身をいじる

 

なお、10分後に自動的に無効にするには、、、

また別の機会で(汗

-