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もよく分からずにカスタマイズしているので、先人の記事がないと対応できない状況です...。
どなたかお分かりの方がいらっしゃいましたらご教示くださいませ。
確定申告(やよいの青色申告&e-Tax)
今年度も何とか(!?)確定申告が完了しました。
今回は"青色申告"だったのですが、何せ帳簿のコトが全く分からず...とりあえずやよいの青色申告をインストールし、知人に聞きながら数字を入力。
続いてe-Taxを利用するためにパソコンをセットアップ。
ICカードの暗証番号が分からず区役所に行って初期化してもらったりとトラブルはありましたが...先ほど無事に提出(送信)が完了しました(^^)v
と、ここからは忘備録。
今回、書類を作成して最後の送信のところでエラーが発生しました。
エラーコードは「AF0020-071」
e-Taxのヘルプにも載っていませんでした。
なのでググってみると、ラッキーなことに同じ境遇の人がいらっしゃいました。
そして、その人と同じ対応を行うことで無事解決♪ありがとうございましたm(__)m
(カンタンに言えば、Safariを64bitで動作させていたことが原因。これを32bitで動かすようにすればOK)
参考にさせてもらったページをご紹介しておきます。
エラーコード:AF0020-701 について: マリオットの盲点
もし高校野球の女子マネージャーがドラッカーの『マネジメント』を読んだら[岩崎 夏海(著)]
久々に小説を読みました。
(初めて本書を目にした時は題名だけを見て『経営学に関する入門書だろう』と勝手に想像していました。)
話題にもなっていましたし何となく買ってみたのですが、読みはじめるまでに一ヶ月くらい放置。そして昨日、ふと思い立って手にしてみたのですが...意外に面白く一気に読み終えてしまいました。
内容につきましては当然賛否はあろうかと思いますが、
個人的には純粋な読み物として、経営やマネジメントに多少なり興味がある方にオススメしたい一冊です。
私的オススメ度 :![]()







