EC-CUBEで購入キーを導入する方法
大人気商品など、購入を制限して特定の人にしか購入できないようにEC-CUBEを改造してみました。
わりと単純?(^_^;)
改造要約:
1,商品登録の種別に「公開」「非公開」の他に「限定商品」を追加する
2,そのままだと全く表示されなくなってしまうので、商品詳細画面URLに購入キーを追加されたら表示する。
3,カート処理はデフォルトのまま。購入完了したら購入キーを使用済にする。
// カスタマイズその1
// 商品登録の種別に「公開」「非公開」の他に「限定商品」を追加する(これにより通常では表示されなくなる)
管理画面のシステム設定->マスターデータ管理(バージョンによっては、基本情報管理->マスターデータ管理)のmtb_dispに「3:限定商品」として追加。
購入キーがないと購入できない商品は「限定商品」にする。
// カスタマイズその2
// 購入キーを管理するテーブルを追加する(内容はINSERT文で入力するか管理画面を作る)
1 2 3 4 5 6 7 8 9 10 |
CREATE TABLE tbl_purchase_key ( `id` int(11) NOT NULL AUTO_INCREMENT, customer_id int(11) NOT NULL, product_id int(11) NOT NULL, purchase_key varchar(255) NOT NULL, used_flag tinyint(1) default 0, created timestamp not null default current_timestamp, modified timestamp null, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; |
// 購入方法
購入者は、以下のようなメールを受け取る事により購入が出来る。GETで商品IDと購入キーが指定されている。
http://localhost/eccube/html/products/detail.php?product_id=4&purchase_key=12345
////// EC-CUBE側の改造 ///////////////
// カスタマイズその3
商品詳細URLを叩かれたら呼ばれるファイル
data\class\pages\products\LC_Page_Products_Detail.php
function action()内の100行目あたりに以下の処理を追加。
GETから購入キーを取得後、プロダクトIDの正当性チェック関数に渡す。(カートに入れる時にPOSTで渡されるので、POSTでも取得できるようにしておく)
1 2 3 4 5 6 7 8 9 10 11 12 13 |
//購入キー(GETかPOSTから取得) $this->purchase_key = isset($_GET[purchase_key]) ? $_GET[purchase_key] : $this->purchase_key; $this->purchase_key = isset($this->purchase_key) ? $this->purchase_key : $_POST[purchase_key]; // ログイン判定 if ($objCustomer->isLoginSuccess() === false && isset($this->purchase_key) ) { SC_Utils_Ex::sfDispSiteError(FREE_ERROR_MSG, "", true,"ログインが必要です。"); } // プロダクトIDの正当性チェック $product_id = $this->lfCheckProductId($this->objFormParam->getValue('admin'),$this->objFormParam->getValue('product_id'), $this->purchase_key); $this->mode = $this->getMode(); |
// カスタマイズその4
// 引数に購入キーを追加。送った購入キー・顧客ID・商品IDの組み合わせが正しかった時のみ商品を表示させる。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 |
/* プロダクトIDの正当性チェック */ function lfCheckProductId($admin_mode,$product_id, $purchase_key) { // 管理機能からの確認の場合は、非公開の商品も表示する。 if (isset($admin_mode) && $admin_mode == 'on') { SC_Utils_Ex::sfIsSuccess(new SC_Session_Ex()); $status = true; $where = 'del_flg = 0'; //購入キーが入力されていたら }else if(!empty($purchase_key)){ // 会員クラス $objCustomer = new SC_Customer_Ex(); $purchase_customer_id = $objCustomer->getValue('customer_id'); // データベースクラス作成 $objQuery =& SC_Query_Ex::getSingletonInstance(); // そのユーザに送った未使用の購入キーならOK $cols = 'purchase_key'; $from = 'tbl_purchase_key'; $where = "customer_id = " . $purchase_customer_id . " AND product_id = " . $product_id . " AND used_flag = 0 "; // SQL実行 $this->arrData = $objQuery->select($cols, $from, $where); //DBの購入キーとURLの購入キーが一致したら表示する。 if($this->arrData[0]['purchase_key'] === $purchase_key){ $status = false; $where = 'del_flg = 0 AND status = 1 or status = 3'; }else { $status = false; $where = 'del_flg = 0 AND status = 1'; } } else { $status = false; $where = 'del_flg = 0 AND status = 1'; } if (!SC_Utils_Ex::sfIsInt($product_id) || SC_Utils_Ex::sfIsZeroFilling($product_id) || !SC_Helper_DB_Ex::sfIsRecord('dtb_products', 'product_id', (array)$product_id, $where) ) { SC_Utils_Ex::sfDispSiteError(PRODUCT_NOT_FOUND); } return $product_id; } |
// カスタマイズその5
カートに入れた後は、通常と同様の処理(トークン管理&画面遷移管理されているので外部からのアクセスは気にしなくても良い)
最後に、購入完了した場合は購入キーの使用済フラグをtrueにして、再使用不可にする。
「ご注文完了ページへ」へのボタンが押された時に、購入キーの使用済フラグを1にする。
data\class\pages\shopping\LC_Page_Shopping_Confirm.phpの144行目あたり
1 2 3 4 5 6 7 8 9 10 11 |
case 'confirm': // 購入キーを使用済にする $purchase_customer_id = $objCustomer->getValue('customer_id'); $product_id = $this->arrCartItems[0][productsClass][product_id]; // SQL実行 $objQuery =& SC_Query_Ex::getSingletonInstance(); $table = 'tbl_purchase_key'; $sqlval = array('used_flag' => 1, 'modified' => 'CURRENT_TIMESTAMP'); $where = "customer_id = ? AND product_id = ?"; $objQuery->update($table, $sqlval, $where, array($purchase_customer_id, $product_id)); |
以下のサイトを参照しました。
http://aerocompact.blog91.fc2.com/blog-entry-12.html