名入りカスタマイズ|名古屋EC-CUBE勉強会vol.2

2019/02/06

2012/11/05のメモ

2回目は、いまやパソコンスクールWASで講師を勤められている児玉先生がお持ちでいらした藤が丘の会場を借りて行いました。

内容は、楽しみにしていたカスタマイズ♪


EC-CUBE2系『名入りカスタマイズ』

使用ファイル

  • data/class/pages/shopping/LC_Page_Shopping_Payment.php
  • data/class/pages/shopping/LC_Page_Shopping_Confirm.php
  • data/class/pages/admin/products/LC_Page_Admin_Products_Product.php
  • data/class/pages/admin/order/LC_Page_Admin_Order_Edit.php
  • data/class/SC_Product.php
  • data/class/SC_CartSession.php
  • data/Smarty/templates/default/shopping/payment.tpl
  • data/Smarty/templates/default/products/detail.tpl
  • data/Smarty/templates/default/shopping/confirm.tpl
  • data/Smarty/templates/admin/products/product.tpl
  • data/Smarty/templates/default/cart/index.tpl
  • data/Smarty/templates/admin/products/confirm.tpl
  • data/Smarty/templates/admin/order/edit.tpl

カスタマイズの流れ

  1. 要件のヒアリング
    ・名入れの受注がしたい・受注するときに入力していただいた内容を管理画面で確認したい・商品ごとの名入れの有無、オプション料金を設定したい・コストを抑え、すぐ始めたい・とりあえずPCのみ・文字数上限設定は省きました・色、フォント、のしも。
  2. 要件定義
    ・管理画面で設定した商品のみ適応可能・名入れのオプション価格が、商品ごとに設定可能なこと・商品詳細にて名入れオプションの表示が可能なこと・注文する商品ごとに名入れの内容を設定可能なこと・受注内容確認画面、管理画面にて名入れの内容を確認可能なこと・EC-CUBE 2.12.2・postgle、MySQLで動作・短期間、低予算で・スマホ、携帯サイトは後日対応で
  3. 設計
  4. 開発
  5. テスト

それでは、カスタマイズ工程にまいりましょう

DBにカラム追加 (putting_nameをnamelogoに置き換えました)

dtb_products に
namelogo_flg,smallint,NOTNULL,DEFAULT,0   
namelogo_price,smallint,NOTNULL,DEFAULT,0
dtb_order に
namelogo_options,text
dtb_order_temp に
namelogo_options,text


admin/products/confirm.tpl


      
            名入れオプション
            
                
            
        
        
            名入れ価格
            
              
        
            
                商品種別     ←ここのうえんところね

/admin/products/product.tpl 131行目くらい

            商品ステータス
            
                
            
        

        
            名入れオプション *
            
                
            
        
        
            名入れ価格
            
              
              background-color: ;"/>円
               (半角数字で入力)
            
        

        
        
            商品種別 *     ←ここのうえね

data/class/SC_CartSession.php 298行目くらい

   /**
     * セッション中の商品情報データの調整。
     * productsClass項目から、不必要な項目を削除する。
     */
    function adjustSessionProductsClass(&$arrProductsClass) {
        $arrNecessaryItems = array(
            'product_id'          => true,
            'product_class_id'    => true,
            'name'                => true,
            'price02'             => true,
            'point_rate'          => true,
            'main_list_image'     => true,
            'main_image'          => true,
            'product_code'        => true,
            'stock'               => true,
            'stock_unlimited'     => true,
            'sale_limit'          => true,
            'class_name1'         => true,
            'classcategory_name1' => true,
            'class_name2'         => true,
            'classcategory_name2' => true,
            'namelogo_flg'    => true,
        );

344行目くらい

                // 商品情報は常に取得
                // TODO 同一インスタンス内では1回のみ呼ぶようにしたい
                $this->cartSession[$productTypeId][$i]['productsClass']
                    =& $objProduct->getDetailAndProductsClass($this->cartSession[$productTypeId][$i]['id']);
                $price = $this->cartSession[$productTypeId][$i]['productsClass']['price02'];
               // 名入れ対応の場合は加算
                if ($this->cartSession[$productTypeId][$i]['productsClass']['namelogo_flg'] == '1') {
                    $price += $this->cartSession[$productTypeId][$i]['productsClass']['namelogo_price'];
                }
                $this->cartSession[$productTypeId][$i]['price'] = $price;
一番下の行に追加(771行目くらい)
/**
* カートの中に名入れ対応商品が含まれるかどうか.
*
* @param integer $productTypeId 商品種別ID
* @return boolean 名入れ対応商品が含まれる場合 true
*/
    function hasNameLogosoptions($productTypeId) {
        $arrItems = $this->getCartList($productTypeId);
        foreach ($arrItems as &$arrItem) {
            if ($arrItem['productsClass']['namelogo_flg'] == '1') {
                return true;
            }
        }
        return false;

data/class/SC_product.php 120行目くらい

    /**
     * SC_Queryインスタンスに設定された検索条件をもとに商品一覧の配列を取得する.
     *
     * 主に SC_Product::findProductIds() で取得した商品IDを検索条件にし,
     * SC_Query::setOrder() や SC_Query::setLimitOffset() を設定して, 商品一覧
     * の配列を取得する.
     *
     * @param SC_Query $objQuery SC_Query インスタンス
     * @return array 商品一覧の配列
     */
    function lists(&$objQuery) {
        $col = <<< __EOS__
             product_id
            ,product_code_min
            ,product_code_max
            ,name
            ,comment1
            ,comment2
            ,comment3
            ,main_list_comment
            ,main_image
            ,main_list_image
            ,price01_min
            ,price01_max
            ,price02_min
            ,price02_max
            ,stock_min
            ,stock_max
            ,stock_unlimited_min
            ,stock_unlimited_max
            ,deliv_date_id
            ,status
            ,del_flg
            ,update_date
            ,namelogo_flg
            ,namelogo_price
__EOS__;

data/class/pages/admin/products/LC_Page_Admin_Products_Product.php 59行目あたり

        $this->arrAllowedTag = $masterData->getMasterData('mtb_allowed_tag');
        $this->arrNameLogoFlg = array('1' => '対応', '0' => '非対応');
    }
328行目あたり
        $objFormParam->addParam('商品ステータス', 'product_status', INT_LEN, 'n', array('NUM_CHECK', 'MAX_LENGTH_CHECK'));
        $objFormParam->addParam('名入れオプション', 'namelogo_flg', INT_LEN, 'n', array('EXIST_CHECK', 'NUM_CHECK', 'MAX_LENGTH_CHECK'));
        $objFormParam->addParam('名入れ価格', 'namelogo_price', PRICE_LEN, 'n', array('NUM_CHECK', 'MAX_LENGTH_CHECK'));
611行目あたり
        // サブ情報ありなしフラグ
        $arrForm['sub_find'] = $this->hasSubProductData($arrForm);
        // 名入れ対応フラグ
        if (SC_Utils_Ex::isBlank($arrForm['namelogo_flg'])) {
            $arrForm['namelogo_flg'] = '0'; // 本当は定数を使う
1014行目くらい
        // INSERTする値を作成する。
        $sqlval['name'] = $arrList['name'];
        $sqlval['status'] = $arrList['status'];
        $sqlval['main_list_comment'] = $arrList['main_list_comment'];
        $sqlval['main_comment'] = $arrList['main_comment'];
        $sqlval['comment1'] = $arrList['comment1'];
        $sqlval['comment2'] = $arrList['comment2'];
        $sqlval['comment3'] = $arrList['comment3'];
        $sqlval['comment4'] = $arrList['comment4'];
        $sqlval['comment5'] = $arrList['comment5'];
        $sqlval['comment6'] = $arrList['comment6'];
        $sqlval['namelogo_flg'] = $arrList['namelogo_flg'];
        $sqlval['namelogo_price'] = $arrList['namelogo_price'];
        $sqlval['deliv_date_id'] = $arrList['deliv_date_id'];

data/shopping/confirm.tpl 283行目くらい 

                お支払方法
                
            
            
            
                名入れの内容
                
            
            
            
                その他お問い合わせ

default/cart/index.tpl 143行目あたり

                        

(名入れ対応)

default/products/detail.tpl 192行目くらい

            
            

default/shopping/payment.tpl 263行目くらい

        
        
        

名入れの内容

名入れ対応商品をご購入の場合は、内容をご入力ください。

(文字まで)

その他お問い合わせ


admin/order/edit.tpl 132行目くらい

        // 受注詳細情報
        $objFormParam->addParam('商品種別ID', 'product_type_id', INT_LEN, 'n', array('EXIST_CHECK', 'MAX_LENGTH_CHECK', 'NUM_CHECK'), '0');
        $objFormParam->addParam('単価', 'price', INT_LEN, 'n', array('EXIST_CHECK', 'MAX_LENGTH_CHECK', 'NUM_CHECK'), '0');
        $objFormParam->addParam('数量', 'quantity', INT_LEN, 'n', array('EXIST_CHECK', 'MAX_LENGTH_CHECK', 'NUM_CHECK'), '0');
        $objFormParam->addParam('商品ID', 'product_id', INT_LEN, 'n', array('EXIST_CHECK', 'MAX_LENGTH_CHECK', 'NUM_CHECK'), '0');
        $objFormParam->addParam('商品規格ID', 'product_class_id', INT_LEN, 'n', array('EXIST_CHECK', 'MAX_LENGTH_CHECK', 'NUM_CHECK'), '0');
        $objFormParam->addParam('ポイント付与率', 'point_rate');
        $objFormParam->addParam('商品コード', 'product_code');
        $objFormParam->addParam('商品名', 'product_name');
        $objFormParam->addParam('規格名1', 'classcategory_name1');
        $objFormParam->addParam('規格名2', 'classcategory_name2');
        $objFormParam->addParam('名入れオプション', 'namelogos_options', LTEXT_LEN, null, array('MAX_LENGTH_CHECK'));
        $objFormParam->addParam('メモ', 'note', MTEXT_LEN, 'KVa', array('MAX_LENGTH_CHECK'));
        $objFormParam->addParam('削除用項番', 'delete_no', INT_LEN, 'n', array('MAX_LENGTH_CHECK', 'NUM_CHECK'));

data_class_pages_shopping_LC_Page_Shopping_Confirm.php 123行目くらい

        $this->arrForm = array_merge($arrOrderTemp, $arrCalcResults);
        // 名入れ商品が含まれるかどうか
        $this->hasNameLogosOptions = $objCartSess->hasNameLogosOptions($this->cartKey);
        // 会員ログインチェック

data_class_pages_shopping_LC_Page_Shopping_Payment.php 133行目くらい

        // お届け日一覧の取得
        $this->arrDelivDate = $objPurchase->getDelivDate($objCartSess, $cart_key);
        // 名入れ商品が含まれるかどうか
        $this->hasNameLogosOptions = $objCartSess->hasNameLogosOptions($cart_key);
        switch ($this->getMode()) {

234行目くらい

                // 名入れオプションの初期値に商品名を表示
                if ($this->hasNameLogosOptions) {
                    $namelogo_options = '';
                    $arrItems = $objCartSess->getCartList($this->cartKey);
                    foreach ($arrItems as $arrItem) {
                        if ($arrItem['productsClass']['namelogo_flg'] == '1') {
                            $namelogos_options .= $arrItem['productsClass']['name'];
                            if (!SC_Utils_Ex::isBlank($arrItem['productsClass']['classcategory_name1'])) {
                                $namelogos_options .= '/' . $arrItem['productsClass']['classcategory_name1'];
                            }
                            if (!SC_Utils_Ex::isBlank($arrItem['productsClass']['classcategory_name2'])) {
                                $namelogos_options .= '/' . $arrItem['productsClass']['classcategory_name2'];
                            }
                            $namelogos_options .= ' => 名入れの内容をご入力' . PHP_EOL;
                        }
                    }
                    $objFormParam->setValue('namelogos_options', $namelogos_options);
                }
                break;
        }
        // モバイル用 ポストバック処理

301行目

        $objFormParam->addParam('ポイントを使用する', 'point_check', INT_LEN, 'n', array('MAX_LENGTH_CHECK', 'NUM_CHECK'), '2');
        $objFormParam->addParam('名入れオプション', 'namelogos_options', LTEXT_LEN, 'KVa', array('SPTAB_CHECK', 'MAX_LENGTH_CHECK'));
        if ($deliv_only) {

まとめ

・・・Evernoteからコピペしただけなのに、整形でどっと疲れました・・・www

よくこれだけまとめましたね。
我ながらたいしたものだと自画自賛です笑笑

勉強会自体開催することも、そんなに経験値はなかったからなぁ。。

大河内さんだけでなく、主催メンバーのマサさんやあんちゃん、会場設備から会場所有者のみなさん、参加のみなさんもたくさんいたような…。
もともとパソコン教室の講師をしていたので、こういう会場で話したりまとめたりはそんなに緊張はなかったけど、全体に気を張り巡らしてとても気を使った覚えがあります。

とりあえず、がんばりましたね!
いまでもまだ稼働していますよ〜♪