名入りカスタマイズ|名古屋EC-CUBE勉強会vol.2
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
カスタマイズの流れ
- 要件のヒアリング
・名入れの受注がしたい・受注するときに入力していただいた内容を管理画面で確認したい・商品ごとの名入れの有無、オプション料金を設定したい・コストを抑え、すぐ始めたい・とりあえずPCのみ・文字数上限設定は省きました・色、フォント、のしも。 - 要件定義
・管理画面で設定した商品のみ適応可能・名入れのオプション価格が、商品ごとに設定可能なこと・商品詳細にて名入れオプションの表示が可能なこと・注文する商品ごとに名入れの内容を設定可能なこと・受注内容確認画面、管理画面にて名入れの内容を確認可能なこと・EC-CUBE 2.12.2・postgle、MySQLで動作・短期間、低予算で・スマホ、携帯サイトは後日対応で - 設計
- 開発
- テスト
それでは、カスタマイズ工程にまいりましょう
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
よくこれだけまとめましたね。
我ながらたいしたものだと自画自賛です笑笑
勉強会自体開催することも、そんなに経験値はなかったからなぁ。。
大河内さんだけでなく、主催メンバーのマサさんやあんちゃん、会場設備から会場所有者のみなさん、参加のみなさんもたくさんいたような…。
もともとパソコン教室の講師をしていたので、こういう会場で話したりまとめたりはそんなに緊張はなかったけど、全体に気を張り巡らしてとても気を使った覚えがあります。
とりあえず、がんばりましたね!
いまでもまだ稼働していますよ〜♪
Category - カテゴリー内 -
All Column Page - 全記事内 -