ショッピングカートEC-CUBEの商品単価に単位をつける

EC-CUBEのお仕事は滅多にないのですが
カスタマイズの案件があったのでメモしておきます。

設置済みのEC-CUBE バージョンは2.4.4でした。

なお、設置から担当してた訳でもなく、
既にカスタマイズされているなどあっても
EC-CUBE初心者の僕では見分けがついてないので
標準では違うけどってあるかもですが、ご了承下さい。

商品の単価に単位をつける

やりたいことは、商品の単位に「箱」や「袋」などを選択させて表示すること。

1.マスタデータ登録

まず、単位を登録するマスタデータを作成します。
データーベースに単位用テーブル「mtb_package」を作成。

CREATE TABLE  `mtb_package` (
`id` TINYINT UNSIGNED NOT NULL ,
`name` VARCHAR( 255 ) NOT NULL ,
`rank` TINYINT UNSIGNED NOT NULL ,
PRIMARY KEY (  `id` )
) ENGINE = InnoDB DEFAULT CHARSET=utf8;

型は最小にしておきました。

商品テーブルに単位の保存フィールドを追加
dtb_products

ALTER TABLE  `dtb_products` ADD  `package` TINYINT UNSIGNED NOT NULL AFTER  `___`;

んー・・
実はあまり自信が無い。
いつもphpmyadminからGUIで操作しちゃっています。

データーベース手動操作はここまで。
phpmyadminを開いていたら閉じちゃいましょう。

続いて、EC-CUBEのコンパネから
単位データを登録していきます。

マスタデータ追加

システム設定→マスタデータ管理
セレクトボックスから「mtb_package」を選択して、項目を追加していきます。

まとめて設定はできないみたいです。
一回ずつ選択ボタンを押して登録していきます。

2.admin 商品登録画面

MySQL固有の処理をするクラス

/data/class/db/dbfactory/SC_DB_DBFactory_MYSQL.php
クラス名:SC_DB_DBFactory_MYSQL

function viewToSubQuery() {
    $sql['vw_products_allclass_detail'] =<<< __EOS__
       (
          SELECT
              dtb_products.product_id,
              dtb_products.name,
              ...

            "vw_products_nonclass" => '
                (SELECT
                    T1.product_id,
                    T1.name,
                    ...

以下にdtb_products.mtb_package,T1.mtb_package,の二箇所に追加
・・T1ってなんの別名だろう?よくわからないがそー書いてあったのでそれにならった。

商品登録のページクラスにDB読み込みを追加

/data/class/pages/admin/products/LC_Page_Admin_Products_Product.php
クラス名:LC_Page_Admin_Products_Product

$this->arrPACKAGE = $masterData->getMasterData("mtb_package");

これでDBから登録情報を拾ってassignしてくれる。

入力用バリデート

// 入力エラーチェック
function lfErrorCheck($array){
   $objErr = new SC_CheckError($array);
    ...
    $objErr->doFunc(array("ケース単位", "package", LLTEXT_LEN), array("SPTAB_CHECK", "MAX_LENGTH_CHECK"));

何をやってるかよくわからないが
前後を見た感じでなんとなく似たように設定。
たぶん違うんだろうな・・(汗)

保存用フィールドの設定

/* 商品の登録 */
function lfRegistProduct($arrList){

    // 配列の添字を定義
    $checkArray = array("name", "item_sort",..."package"); //"package"を追加
    $arrList = SC_Utils_Ex::arrayDefineIndexes($arrList, $checkArray);

    // INSERTする値を作成する。
    $sqlval['name'] = $arrList['name'];
    ...
    $sqlval['package'] = $arrList['package'];//追加

テンプレートファイル

登録画面用

/data/Smarty/templates/default/admin/products/product.tpl


表示させたい場所に上記を挿入。
html_optionsタグってなんか使い方が違うような・・。EC-CUBEオリジナルでしょうか。

確認画面

/data/Smarty/templates/default/admin/products/product.tpl


表示させたい場所に上記を挿入。

3.フロント画面

データベース読み込みクラスを変更

商品一覧 のページクラス

普通ならこっち
/data/class/pages/products/LC_Page_Products_List.php
クラス名:LC_Page_Products_List

カスタマイズしている場合はこっち
/data/class_extends/page_extends/products/LC_Page_Products_List_Ex.php
クラス名:LC_Page_Products_List_Ex

/**
 * Page を初期化する.
 *
 * @return void
 */
function init() {
    parent::init();
    $masterData = new SC_DB_MasterData_Ex();
    $this->arrSTATUS = $masterData->getMasterData("mtb_status");
    ...
    $this->arrPACKAGE = $masterData->getMasterData("mtb_package");//追加

商品詳細 のページクラス

普通ならこっち
/data/class/pages/products/LC_Page_Products_Detail.php
クラス名:LC_Page_Products_Detail

カスタマイズしている場合はこっち
/data/class_extends/page_extends/products/LC_Page_Products_Detail_Ex.php
クラス名:LC_Page_Products_Detail_Ex

/**
 * Page を初期化する.
 *
 * @return void
 */
function init() {
    parent::init();
        $masterData = new SC_DB_MasterData_Ex();
        $this->arrSTATUS = $masterData->getMasterData("mtb_status");
        ...
        $this->arrPACKAGE = $masterData->getMasterData("mtb_package");//追加

テンプレート

普通ならここらへんのファイルだと思うのだが
data/Smarty/templates/default/

カスタマイズ用フォルダを参照してるっぽかったのでこっち

一覧ページ

/user_data/packages/default/list.tpl



むー・・
配列から配列参照できればよかったのだが
うまく書けなかったので一旦assignしてから代入

詳細ページ

/user_data/packages/default/detal.tpl


これで一通りの作業が完了です。
おつかれ!

コメント

タイトルとURLをコピーしました