読者です 読者をやめる 読者になる 読者になる

EC-CUBEのカスタマイズ ポイントシステムのON/OFF機能を実装

管理画面のポイント設定で、こんな風に

やろうかと思った。


が、やるとしたらポイント付与率や会員登録時付与ポイントなどが入っているテーブル「dtb_baseinfo」にON/OFFのフラグを保持する新しく列を追加して、いちいちそのテーブルを参照しないといけなくて無駄と思ったので、やめた。

ちなみに↑のような画面をやるには、
基本情報テーブル拡張して、

alter table `dtb_baseinfo` add `point_enable_flg` smallint;

data/Smarty/templates/テンプレート/admin/basis/point.tplのポイント付与率の行の上の辺りに

<tr class="fs12n">
	<td bgcolor="#f2f1ec" width="170">ポイントシステム ON/OFF<span class="red"> *</span></td>
	<td bgcolor="#ffffff" width="557">
	<!--{assign var=key value="point_enable_flg"}-->
	<span class="red12"><!--{$arrErr[$key]}--></span>
	  <input type="checkbox" name="<!--{$arrForm[$key].keyname}-->" value="1" <!--{if $arrForm[$key].value == "1"}-->checked<!--{/if}--> />
	  ポイントシステムを使わない場合にはチェックをはずしてください。</td>
</tr>

って書いて、ページクラスを拡張すればできる。
data/class_extends/page_extends/admin/bases/LC_Page_Admin_Basis_Point_Ex.php
lfInitParam()のオーバーライド。

<?
/* パラメータ情報の初期化 */
function lfInitParam() {
    parent::lfInitParam();
    $this->objFormParam->addParam("ポイントシステム ON/OFF", "point_enable_flg", INT_LEN, "n", array("NUM_CHECK"));
}
?>

結構、ポイントを扱っている画面は多い。受注完了メールとかもある。
ポイントシステムを使うか使わないかなんて、お店をオープンさせる前に決めることだし、それからのON/OFF切り替えなんて頻繁にやることないと思うので、で有料ギフト包装の税込金額を設定したときのように、ON/OFF情報は定数「POINT_SYSTEM_MODE」としてもつことにした。

カスタマイズ概要

  1. ポイントシステムのON/OFF情報を持つ定数「POINT_SYSTEM_MODE」を作って設定する。
    • true :ポイントシステムを使う
    • false:ポイントシステムを使わない
  2. ポイントを扱っている画面のテンプレートで、ポイント部分の記述をPOINT_SYSTEM_MODEがfalseのときはださないようにする。
  3. ポイントシステムOFFのときは、画面の制御だけじゃなくて、買い物時にポイント自体たまらないようにする。
  4. ポイントシステムOFFのときに、お支払方法・お届け時間等の指定画面で「ポイントを使う」「使うポイント数」の変数を直POSTされても値引きしないように対策する。

1.ポイントシステムのON/OFF情報を持つ定数設定しておく

以下SQLで新しく定数を登録する。

INSERT INTO `mtb_constants` values('POINT_SYSTEM_MODE', 'false', '524', 'ポイントシステムを使うかどうか。(true:使う、false:使わない)');
  • 1つ目のidが定数名。
  • 2つ目のnameに入れるのが定数の値。今回の場合はtureかfalse。
  • 3番目のrankに入れるのが管理画面での表示順。今入っているレコードの最大+1だと一番下に表示される。
  • 4番目のremarkに入れるのが管理画面でパラメータ入力欄の上に灰色で小さく出るパラメータの説明文。

次に、管理画面>基本情報管理>マスタデータ管理へアクセスし、一回保存する。
そうすると、「マスタテーブル」⇒「定数設定ばっかりするPHPファイル」に変換することでDBをキャッシュするようにしてるファイルが更新される。
data/cache/mtb_*.phpが、それら。


2.テンプレートでif文きってポイントシステムON/OFF時の表示を切り替える。

たとえば、こんな感じで簡単に。

<!--{if $smarty.const.POINT_SYSTEM_MODE == true }-->
    <!--ポイントシステムONのときの表示-->
<!--{else}-->
    <!--ポイントシステムOFFのときの表示-->
<!--{/if}-->

手を加えるテンプレートは以下。

ログインブロック

ポイントシステムOFFの時、所持ポイントを数非表示にする。

管理画面でデザイン等を変更している場合は、

  • html/user_data/packages/テンプレート名/bloc/login.tpl
MYページ

ポイントシステムOFFの時、左下の所持ポイント数を非表示にする。

  • data/Smarty/templates/テンプレート/mypage/navi.tpl

ポイントシステムOFFの時、購入履歴の「ご使用ポイント」「今回加算されるポイント」を非表示にする。

  • data/Smarty/templates/テンプレート/mypage/history.tpl

※ポイント値引き行の部分は、途中でポイントシステムON→OFFに切り替えたときに前の買い物で使っていたことがあるかもしれないので、定数によってきりかえない。ポイント値引きをしないとこの行自体でないので、そのままで大丈夫。

商品詳細ページ

ポイントシステムOFFの時、付与ポイント数を非表示にする。

  • data/Smarty/templates/テンプレート/detail.tpl

管理画面でデザイン等を変更している場合は、

  • html/user_data/packages/テンプレート名/detail.tpl
カート

ポイントシステムOFFの時、『●● 様の、現在の所持ポイントは「● pt」です。』の部分と、今回加算ポイントの行を非表示にする。

  • data/Smarty/templates/テンプレート/cart/index.tpl

ポイントシステムOFFの時、ポイント使用の指定の一帯を非表示にする

  • data/Smarty/templates/テンプレート/shopping/payment.tpl

ポイントシステムOFFの時、『ご注文前のポイント』『ご注文前のポイント』『今回加算されるポイント』『ご注文完了後のポイント』、▼お支払方法・お届け時間の指定・その他お問い合わせの『ポイント使用』を非表示にする。

  • data/Smarty/templates/テンプレート/shopping/confirm.tpl
メールテンプレート

ポイントシステムOFFの時、ポイント関連を非表示にする。

  • data/Smarty/templates/テンプレート/mail_templates/order_mail.tpl


管理側のテンプレートは別にやらなくてもいいと思うけど、やるなら以下の場所が対象。

「ポイントシステムを使うには、パラメータ設定メニューから、『POINT_SYSTEM_MODE』をtrueにしてください。」
見たいな感じで、ポイントの設定項目を出さないようにする。

  • data/Smarty/templates/テンプレート/admin/basis/point.tpl

基本情報のポイント設定メニュー自体出さないようにする。

  • data/Smarty/templates/テンプレート/admin/basis/subnavi.tpl

ポイント付与率を出さないようにする。

  • data/Smarty/templates/テンプレート/admin/products/product.tpl
  • data/Smarty/templates/テンプレート/admin/products/confirm.tpl

※顧客管理の所持ポイントや受注履歴編集のポイント部分は、MYページの購入履歴と一緒で、途中でポイントシステムON→OFFに切り替えたときに前の買い物で使っていたことがあるかもしれないので、定数によってきりかえないほうがいいかもしれないのでやらない。


モバイルのほうはもともとポイントとか使えないみたいだし(バージョン2.1.2での話)、
受注完了メールや注文履歴の画面にもポイントが出てこないのでそのままでOKっぽい。

3.お支払方法・お届け時間等の指定画面でパラメータ直POSTによるポイント値引きが行われないように防御

data/class_extends/page_extends/shopping/LC_Page_Shopping_Payment_Ex.php
lfCheckError()をオーバーライド。

<?
    function lfCheckError($arrData) {
        // ポイントシステム無効時に直POSTされても値引きしないように対策。
        if ( defined( 'POINT_SYSTEM_MODE' ) && ( POINT_SYSTEM_MODE == false ) ) {
            // リクエスト上書き
            $_POST['point_check'] = "";
            $_POST['use_point'] = "";
            $this->objFormParam->setValue( 'point_check', null );
            $this->objFormParam->setValue( 'use_point', null );
        }
        
        return parent::lfCheckError( $arrData );
    }
?>


data/class_extends/helper_extends/SC_Helper_DB_Ex.php
sfTotalConfirm()をオーバーライド。
ギフト包装の部分は、の話。

<?
    function sfTotalConfirm($arrData, &$objPage, &$objCartSess, $arrInfo, $objCustomer = "") {
        $arrData = parent::sfTotalConfirm($arrData, &$objPage, &$objCartSess, $arrInfo, $objCustomer = "");
        
        // ポイントシステムのON/OFF対応。OFFのときはポイント加算しない。かつ、バースデーポイントもつけない。
        if ( defined( 'POINT_SYSTEM_MODE' ) && ( POINT_SYSTEM_MODE == false ) ) {
            $arrData['birth_point'] = 0;
            $arrData['add_point'] = 0;
        }
        
        // ギフト包装料金の計算。合計とお支払い合計を計算しなおしす。0はギフト包装なしのこと。
        if ( intval( $arrData["memo09"] ) > 0 ) {
            // 合計の計算
            $arrData['total'] += GIFT_PRICE;
            // お支払い合計
            $arrData['payment_total'] = $arrData['total'] - ($arrData['use_point'] * POINT_VALUE);
            $arrData['memo10'] = GIFT_PRICE;
        } else {
            $arrData['memo10'] = 0;
        }
                
        return $arrData;
    }
?>

4.管理側受注管理で受注情報を編集しても加算ポイントがつかないようにする

data/class_extends/util_extends/SC_Utils_Ex.php
sfPrePoint()をオーバーライド。

<?
/* ポイント付与 */
function sfPrePoint($price, $point_rate, $rule = POINT_RULE, $product_id = "") {
    
    if ( defined( 'POINT_SYSTEM_MODE' ) && ( POINT_SYSTEM_MODE == false ) ) {
        return 0;
    }
    
    return parent::sfPrePoint( $price, $point_rate, $rule, $product_id );
}
?>


これでオッケー。