盲点でした・・・
メインとなるデータベースのVIEWを作ればよかったのです。
ただし、2系と3系の項目の差は埋めなければなりません。
既存のdtb_customerは、とりま、別名にして退避。
create view dtb_customer as
select * from `maindatabase`.dtb_customer;
単純なselect文なので、挿入・更新も可能。
はっーー、無駄なことを・・・
以下、その作業工程・・・
ECCUBE3、4なら、↓こちらをもとに、共有可能だが、
今回は、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で見ると、邪魔だから、なんとかスマートにできないか?
と、試行錯誤した↓、が割と役に立つ。
実際、主キー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
まあ、こんなアホなことする方は、なかなかいないと思いますが、
上記で、理解できない方は、
バージョン統合するのが、よろしいです!!