ネットショップを無料で構築します!成果報酬型だから運営固定費もゼロ!

ネットショップ構築&運営サポート|ビー・フレンド<Be-friend>

広島県広島市内であれば直接お伺いします♪

トップページ > 2011年3月

EC-CUBEカスタマイズ - 商品詳細ページにテキスト入力欄を追加


久々にEC-CUBEをイジったので忘備録としてまとめておきます。

今回行ったカスタマイズは、
『EC-CUBEの商品詳細ページにテキスト入力欄(品番入力欄)を追加する』
というものです。

本カスタマイズを行うにあたりまして、以下の記事を参考にさせていただきました。
こちらの記事がなければこのカスタマイズが実現することはありませんでした。感謝です。

EC-CUBEカスタマイズ サイズなど商品固有の項目を追加する

EC-cube商品規格を増やす方法 その一
EC-cube商品規格を増やす方法 その二
EC-cube商品規格を増やす方法 その三

カスタマイズ方法を探している時に以下の記事もヒットしたのですが、サイトオーナーさんへの連絡方法が分からず...。
もしどなたか連絡方法をご存知でしたら教えてくださいm(__)m
【EC-CUBE】商品詳細ページにカスタム入力欄を追加する(プレ)

それでは本題。今回のカスタマイズ要件は以下の通りです。

【フロント画面】

  • 商品詳細ページでユーザーに情報(品番)を入力してもらう
  • 入力には必須チェックをかける
  • 入力した情報をカートページ・注文確認ページで確認できる
  • 入力した情報を注文確認メールに記載する

【管理画面】

  • 商品登録画面で、入力ボックスの表示ON/OFFを選択できる
  • 入力された情報を管理画面(注文情報)で確認できる
  • 入力された情報を管理画面から通知メールに記載できる

データベース編集

以下の通りデータベース(テーブル)へカラムを追加する。

    テキスト入力欄を表示するか否かを判別するフラグ
  • テーブル:dtb_products
  • 追加フラグ:add_flg
    テキスト入力欄(テキストボックス)
  • テーブル:tb_order_detail
  • 追加フラグ:add_field

商品詳細ページ

[eccube]/data/Smarty/templates/default/detail.tpl
([eccube]/html/user_data/packages/default/detail.tpl)

変更前
            <br /><span class="attention">※ <!--{$tpl_class_name2}-->を入力して下さい。</span>
            <!--{/if}-->
          
        
          <!--{/if}-->

        <dl>
          <dt>個  数</dt>
変更後
           <br /><span class="attention">※ <!--{$tpl_class_name2}-->を入力して下さい。</span>
            <!--{/if}-->
          
        
          <!--{/if}-->

       <!--{if $arrProduct.add_flg == 1}-->
        <dl>
          <dt>
			テキスト入力欄
          </dt>
          <dd>
          	<input name="add_field" class="box54" value="<!--{$add_field}-->" style="" type="text" />
          </dd>
        </dl>
        <!--{/if}-->

        <dl>
          <dt>個  数</dt>

[eccube]/data/class/pages/products/LC_Page_Products_Detail.php

function process() {
case 'cart':

変更前
                $classcategory_id2 = $_POST['classcategory_id2'];

                if (!empty($_POST['gmo_oneclick'])) {
変更後
                $classcategory_id2 = $_POST['classcategory_id2'];
                $add_field = $_POST['add_field'];

                if (!empty($_POST['gmo_oneclick'])) {
変更前
                $objCartSess->addProduct(array($_POST['product_id'], $classcategory_id1, $classcategory_id2), $this->objFormParam->getValue('quantity'));
変更後
                $objCartSess->addProduct(array($_POST['product_id'], $classcategory_id1, $classcategory_id2, $add_field), $this->objFormParam->getValue('quantity'));

function lfInitParam() {

変更前
        $this->objFormParam->addParam("規格2", "classcategory_id2", INT_LEN, "n", array("NUM_CHECK", "MAX_LENGTH_CHECK"));
        $this->objFormParam->addParam("個数", "quantity", INT_LEN, "n", array("EXIST_CHECK", "ZERO_CHECK", "NUM_CHECK", "MAX_LENGTH_CHECK"));
変更後
        $this->objFormParam->addParam("規格2", "classcategory_id2", INT_LEN, "n", array("NUM_CHECK", "MAX_LENGTH_CHECK"));
        $this->objFormParam->addParam("テキスト入力欄", "add_field", INT_LEN, "n", array("EXIST_CHECK", "MAX_LENGTH_CHECK"));
        $this->objFormParam->addParam("個数", "quantity", INT_LEN, "n", array("EXIST_CHECK", "ZERO_CHECK", "NUM_CHECK", "MAX_LENGTH_CHECK"));

function lfCheckError() {

変更前
        if ($this->tpl_classcat_find2) {
            $objErr->doFunc(array("規格2", "classcategory_id2"), array("EXIST_CHECK"));
        }

        return $objErr->arrErr;
変更後
        if ($this->tpl_classcat_find2) {
            $objErr->doFunc(array("規格2", "classcategory_id2"), array("EXIST_CHECK"));
        }

        $objErr->doFunc(array("テキスト入力欄", "add_field"), array("EXIST_CHECK"));

        return $objErr->arrErr;

[eccube]/data/class/db/dbfactory/SC_DB_DBFactory_MYSQL.php

viewToSubQuery関数内のSELECT文に以下を追加

変更前
                    dtb_products.deliv_date_id,
                    T4.product_code_min,
変更後
                    dtb_products.deliv_date_id,
                    dtb_products.add_flg,
                    T4.product_code_min,

return vw_products_nonclassに以下を追加

変更前
                    T1.deliv_date_id,
                    T2.product_id_sub,
変更後
                    T1.deliv_date_id,
                    T1.add_flg,
                    T2.product_id_sub,

[eccube]/data/class/pages/shopping/LC_Page_Shopping_Confirm.php

変更前
        // フレームを選択(キャンペーンページから遷移なら変更)
        $objCampaignSess->pageView($objView);
    }
変更後
        // フレームを選択(キャンペーンページから遷移なら変更)
		$objCampaignSess->pageView($objView);
		
		$arrCart = $objCartSess->getCartList();
		$max = count($arrCart);
		
		foreach($arrCart as $i => $row){
		$this->arrProductsDetails[$i]['add_field'] = $arrCart[$i]['id'][3];
		}

    }

[eccube]/data/class/pages/shopping/LC_Page_Shopping_Complete.php

変更前
                $sqlval['quantity'] = $arrCart[$i]['quantity'];
                $this->lfReduceStock($objQuery, $arrCart[$i]['id'], $arrCart[$i]['quantity']);
変更後
                $sqlval['quantity'] = $arrCart[$i]['quantity'];
                $sqlval['add_field'] = $arrCart[$i]['id'][3];
                array_splice($arrCart[$i]['id'],3);
                $this->lfReduceStock($objQuery, $arrCart[$i]['id'], $arrCart[$i]['quantity']);

カートページ

[eccube]/data/Smarty/templates/default/cart/index.tpl

変更前
           <!--{if $arrProductsClass[cnt].classcategory_name2 != ""}-->
             <!--{$arrProductsClass[cnt].class_name2}-->:<!--{$arrProductsClass[cnt].classcategory_name2}-->
           <!--{/if}-->
         </td>
         <td class="pricetd">
変更後
           <!--{if $arrProductsClass[cnt].classcategory_name2 != ""}-->
             <!--{$arrProductsClass[cnt].class_name2}-->:<!--{$arrProductsClass[cnt].classcategory_name2}-->
           <!--{/if}-->
           <!--{ if $arrProductsDetails[cnt].add_field!="" }-->
           		テキスト入力欄:<!--{$arrProductsDetails[cnt].add_field}--><br />
           <!--{/if}-->
         </td>
         <td class="pricetd">

[eccube]/data/class/pages/cart/LC_Page_Cart.php

変更前
        // 基本情報の取得
        $arrInfo = $objSiteInfo->data;

        // 商品購入中にカート内容が変更された。
変更後
        // 基本情報の取得
        $arrInfo = $objSiteInfo->data;

        //追加規格名表示処理
        $arrCart = $objCartSess->getCartList();
        $max = count($arrCart);
        foreach($arrCart as $i => $row){
            $this->arrProductsDetails[$i]['add_field'] = $arrCart[$i]['id'][3];
        }

        // 商品購入中にカート内容が変更された。

[eccube]/data\class\helper\SC_Helper_DB.php

変更前
                $objPage->arrProductsClass[$cnt]['classcategory_name2'] =
                    $arrClassCatName[$arrData['classcategory_id2']];

                // 画像サイズ
変更後
                $objPage->arrProductsClass[$cnt]['classcategory_name2'] =
                    $arrClassCatName[$arrData['classcategory_id2']];

                $objPage->arrProductsDetails[$cnt]['add_field'] = $arrCart[$i]['id'][3];

                // 画像サイズ

注文完了メール

[eccube]/data/Smarty/templates/default/mail_templates/order_mail.tpl

変更前
商品コード: <!--{$arrOrderDetail[cnt].product_code}-->
数量:<!--{$arrOrderDetail[cnt].quantity}--> 個
変更後
商品コード: <!--{$arrOrderDetail[cnt].product_code}-->
<!--{if $arrOrderDetail[cnt].add_field!="" }-->
テキスト入力欄: <!--{$arrOrderDetail[cnt].add_field}-->
<!--{/if}-->
数量:<!--{$arrOrderDetail[cnt].quantity}--> 個

管理画面

[eccube]/data/Smarty/templates/default/admin/products/product.tpl

変更前
                                        <input type="button" name="btn" onclick="selectAll('category_id'); fnModeSubmit('upload_image', 'image_key', '<!--{$key}-->')" value="アップロード">
                                        </td>
                                    </tr>
                                    *}-->
                                </table>

                                <!--{* オペビルダー用 *}-->
変更後
                                        <input type="button" name="btn" onclick="selectAll('category_id'); fnModeSubmit('upload_image', 'image_key', '<!--{$key}-->')" value="アップロード">
                                        </td>
                                    </tr>
                                    *}-->

                                    <!--フラグ設定-->
                                    <tr class="fs12n">
                                        <td bgcolor="#f2f1ec" width="160">フラグ設定</td>
                                        <td bgcolor="#ffffff" width="557">
                                            <label><input type="checkbox" name="add_flg" value="1" <!--{if $arrForm.add_flg == 1}-->checked="checked"<!--{/if}--> />テキスト入力欄</label>
                                        </td>
                                    </tr>
                                    <!--ここまで--> 

                                </table>

                                <!--{* オペビルダー用 *}-->

[eccube]/data/Smarty/templates/default/admin/products/confirm.tpl

変更前
                                <!--▲関連商品-->
                                <!--{/if}-->
                            </table>
変更後
                                <!--▲関連商品-->
                                <!--{/if}-->
					
                                <tr>
                                    <td bgcolor="#f2f1ec" width="160" class="fs12n">フラグ設定</td>
                                    <td bgcolor="#ffffff" width="557" class="fs12n">
                                        [テキスト入力欄]<!--{$arrDISP[$arrForm.add_flg]}--><br />
                                    </td>
                                </tr>

                            </table>

[eccube]/data/class/pages/admin/products/LC_Page_Admin_Products_Product.php

lfRegistProduct関数内
// 配列の添字を定義

変更前
                            "sale_limit", "sale_unlimited", "deliv_date_id", "note");
変更後
                            "sale_limit", "sale_unlimited", "deliv_date_id", "note", "add_flg");

// INSERTする値を作成する。

変更前
        $sqlval['creator_id'] = $_SESSION['member_id'];
        $arrRet = $this->objUpFile->getDBFileList();
変更後
        $sqlval['creator_id'] = $_SESSION['member_id'];
        $sqlval['add_flg'] = $arrList['add_flg'];
        $arrRet = $this->objUpFile->getDBFileList();

lfConvertParam関数内
// スポット商品

変更前
        $arrConvList['deliv_fee'] = "n";

        // 詳細-サブ
変更後
        $arrConvList['deliv_fee'] = "n";
        $arrConvList['add_flg'] 	= "n";

        // 詳細-サブ

受注管理(管理画面)

[eccube]/data/Smarty/templates/default/shopping/confirm.tpl

変更前
              <li><!--{$arrProductsClass[cnt].class_name2}-->:<!--{$arrProductsClass[cnt].classcategory_name2}--></li>
              <!--{/if}-->
            </ul>
         </td>
         <td class="pricetd">
変更後
              <li><!--{$arrProductsClass[cnt].class_name2}-->:<!--{$arrProductsClass[cnt].classcategory_name2}--></li>
              <!--{/if}-->

              <!--{ if $arrProductsDetails[cnt].add_field!="" }-->
                  テキスト入力欄:<!--{$arrProductsDetails[cnt].add_field}--><br />
              <!--{/if}-->

          </ul>
         </td>
         <td class="pricetd">

[eccube]/data/Smarty/templates/default/admin/order/edit.tpl

変更前
                                    <!--{if $product_count > 1}-->
                                        <input type="button" name="delete" value="削除" onclick="fnSetFormVal('form1', 'delete_no', <!--{$key}-->); fnModeSubmit('delete_product','anchor_key','order_products');" />
                                    <!--{/if}-->
                                </td>
変更後
                                    <!--{if $product_count > 1}-->
                                        <input type="button" name="delete" value="削除" onclick="fnSetFormVal('form1', 'delete_no', <!--{$key}-->); fnModeSubmit('delete_product','anchor_key','order_products');" />
                                    <!--{/if}-->

                                    <br />
                                    <!--{if $arrForm.product_add_field.value[$key] !="" }-->
                                    [テキスト入力欄]<!--{$arrForm.product_add_field.value[$key]|escape}--><br />
                                    <!--{/if}-->

                                </td>
変更前
                                           <input type="image" onMouseover="chgImgImageSubmit('<!--{$TPL_DIR}-->img/contents/btn_regist_on.jpg',this)" onMouseout="chgImgImageSubmit('<!--{$TPL_DIR}-->img/contents/btn_regist.jpg',this)" src="<!--{$TPL_DIR}-->img/contents/btn_regist.jpg" width="123" height="24" alt="この内容で登録する" border="0" name="subm" onclick="return fnConfirm();">
変更後
<!--▼【暫定処置】テキスト入力のカスタマイズの結果、受注画面で情報を登録すると入力されたがクリアされるので変更できないようにボタンを非表示に-->
<!--                                           <input type="image" onMouseover="chgImgImageSubmit('<!--{$TPL_DIR}-->img/contents/btn_regist_on.jpg',this)" onMouseout="chgImgImageSubmit('<!--{$TPL_DIR}-->img/contents/btn_regist.jpg',this)" src="<!--{$TPL_DIR}-->img/contents/btn_regist.jpg" width="123" height="24" alt="この内容で登録する" border="0" name="subm" onclick="return fnConfirm();">-->
<!--▲ここまで-->

[eccube]/data/class/pages/admin/order/LC_Page_Admin_Order_Edit.php

変更前
        $this->objFormParam->addParam("規格名2", "classcategory_name2");
        $this->objFormParam->addParam("メモ", "note", MTEXT_LEN, "KVa", array("MAX_LENGTH_CHECK"));
変更後
        $this->objFormParam->addParam("規格名2", "classcategory_name2");
        $this->objFormParam->addParam("テキスト入力欄", "product_add_field");
        $this->objFormParam->addParam("メモ", "note", MTEXT_LEN, "KVa", array("MAX_LENGTH_CHECK"));

function lfGetOrderDetail($order_id) {

変更前
        $col = "product_id, classcategory_id1, classcategory_id2, product_code, product_name, classcategory_name1, classcategory_name2, price, quantity, point_rate";
変更後
        $col = "product_id, classcategory_id1, classcategory_id2, product_code, product_name, classcategory_name1, classcategory_name2, add_field product_add_field, price, quantity, point_rate";

【残件】

  • 受注管理の編集対応(現在暫定処置中)
  • 入力した値の購入履歴への表示

残件にも対応出来るよう頑張ってみたのですが、なにせPHPもSmatyもよく分からずにカスタマイズしているので、先人の記事がないと対応できない状況です...。
どなたかお分かりの方がいらっしゃいましたらご教示くださいませ。

2011年3月21日


確定申告(やよいの青色申告&e-Tax)


今年度も何とか(!?)確定申告が完了しました。

今回は"青色申告"だったのですが、何せ帳簿のコトが全く分からず...とりあえずやよいの青色申告をインストールし、知人に聞きながら数字を入力。
続いてe-Taxを利用するためにパソコンをセットアップ。

ICカードの暗証番号が分からず区役所に行って初期化してもらったりとトラブルはありましたが...先ほど無事に提出(送信)が完了しました(^^)v

と、ここからは忘備録。
今回、書類を作成して最後の送信のところでエラーが発生しました。
エラーコードは「AF0020-071」
e-Taxのヘルプにも載っていませんでした。

なのでググってみると、ラッキーなことに同じ境遇の人がいらっしゃいました。
そして、その人と同じ対応を行うことで無事解決♪ありがとうございましたm(__)m
(カンタンに言えば、Safariを64bitで動作させていたことが原因。これを32bitで動かすようにすればOK)

参考にさせてもらったページをご紹介しておきます。
エラーコード:AF0020-701 について: マリオットの盲点

2011年3月 8日


もし高校野球の女子マネージャーがドラッカーの『マネジメント』を読んだら[岩崎 夏海(著)]


久々に小説を読みました。
(初めて本書を目にした時は題名だけを見て『経営学に関する入門書だろう』と勝手に想像していました。)

話題にもなっていましたし何となく買ってみたのですが、読みはじめるまでに一ヶ月くらい放置。そして昨日、ふと思い立って手にしてみたのですが...意外に面白く一気に読み終えてしまいました。

内容につきましては当然賛否はあろうかと思いますが、
個人的には純粋な読み物として、経営やマネジメントに多少なり興味がある方にオススメしたい一冊です。

私的オススメ度 :オススメ度4.5

2011年3月 7日



代表よりご挨拶

担当者よりご挨拶

ネットショップの開業をお考えの方、ぜひ一度当社にご相談ください。プランニングから構築・運営管理まで、当社がフルサポートいたします。ご相談は無料ですのでお気軽にどうぞ♪

〒730-0041
広島県広島市中区小町1-27
清和ビル302《FLAGS Hiroshima》
E-mail;
contact☆be-friend.biz
(☆を@に書き換えてお送りください)
営業時間 AM9:00~PM6:00
(土・日・祝日を除く)

お問い合わせはこちら »

社名に込めた思い


 befriend 
[他動詞]

訳)友人になる・仲良くなる・~の味方となる・助ける、など。

他動詞とは、相手がいて初めて意味を成す言葉のことを指します。
これを当社に置き換えると、相手とはお客さまのこと。つまり、お客さまの助けになりたい、お客さまのお役に立ちたいという思いを込めて社名としました。

お客さまから「ありがとう」の言葉をいただけるよう、精一杯お手伝いすることをお約束します。