住所項目追加機能(EC-CUBEプラグイン)
EC-CUBEを利用していて、基幹システムや他のシステムとの連動で、住所項目を別の形に切り分けたいなどの要望があったりします。デフォルトだと「都道府県」「市区町村名」「番地・ビル名」になっていて、例えば「山梨県甲斐市中下条1929-103」を当てはめると以下のようになります。
都道府県: 山梨県
市区町村名: 甲斐市中下条
番地・ビル名: 1929-103
これでも基本的には問題ないのかもしれませんが、項目を増やしてみたいと思うこともあったりします。
例えば以下のようにやってみたいと考えたりもするわけです。
都道府県: 山梨県
市区町村名: 甲斐市
町域・番地: 中下条1929
ビル名など: 103
やりたいことと環境
- EC-CUBEバージョン: 2.13.3
- 住所の項目を一つ増やす
- ここではPCレイアウトのみ
- プラグインやその他に影響がでる可能性がある(自己責任で)
DBの調整
ひとまず調整するテーブルを列挙します。
以下の6テーブル。
- mtb_constants
- dtb_customer
- dtb_shipping
- dtb_order_temp
- dtb_order
- dtb_other_deliv
①mtb_constants の調整
住所を分ける上で、表示される説明部も調整した方が良いかと思います。
作業は id が「SAMPLE_ADDRESS1」と「SAMPLE_ADDRESS2」は値の更新、「SAMPLE_ADDRESS3」は追加することにします。
SAMPLE_ADDRESS1 を “市町村名称”
SAMPLE_ADDRESS2 を “町大字・番地名称”
SAMPLE_ADDRESS3 を “アパート・マンション名称”
[html] UPDATE `mtb_constants` SET `name` = '"市町村名称"' WHERE `mtb_constants`.`id` = 'SAMPLE_ADDRESS1'; UPDATE `mtb_constants` SET `name` = '"町大字・番地名称"' WHERE `mtb_constants`.`id` = 'SAMPLE_ADDRESS2'; INSERT INTO `mtb_constants` (`id`, `name`, `rank`, `remarks`) VALUES ('SAMPLE_ADDRESS3', '"アパート・マンション名称"', '3', 'フロント表示関連'); [/html]
②dtb_customer の調整
会員情報テーブルに住所カラムを追加します。
カラム名は「addr03」としてみます。
どうでもよいですが、念のため「addr02」の次に追加しておきます。
[html] ALTER TABLE `dtb_customer` ADD `addr03` TEXT CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL AFTER `addr02` ; [/html]
③dtb_shipping の調整
配送先テーブルに住所カラムを追加します。
カラム名は「shipping_addr03」としてみます。
こちらも念のため「shipping_addr02」の次に追加しておきます。
[html] ALTER TABLE `dtb_shipping` ADD `shipping_addr03` TEXT NULL DEFAULT NULL AFTER `shipping_addr02`; [/html]
④dtb_order_temp の調整
dtb_order_temp にカラムを追加します。
カラム名は「order_addr03」で、「order_addr02」の次に追加します。
[html] ALTER TABLE `dtb_order_temp` ADD `order_addr03` TEXT NULL DEFAULT NULL AFTER `order_addr02`; [/html]
⑤dtb_order の調整
dtb_order にカラムを追加します。
カラム名は「order_addr03」で、「order_addr02」の次に追加します。
[html] ALTER TABLE `dtb_order` ADD `order_addr03` TEXT NULL DEFAULT NULL AFTER `order_addr02`; [/html]
⑥dtb_other_deliv の調整
dtb_other_deliv にカラムを追加します。
カラム名は「addr03」で、「addr02」の次に追加します。
[html] ALTER TABLE `dtb_other_deliv` ADD `addr03` TEXT NULL DEFAULT NULL AFTER `addr02`; [/html]
ファイルの調整
クラスファイルやテンプレートを調整します。
調整が必要なファイルは13ファイル。
- /html/js/eccube.js
- /data/Smarty/templates/admin/customer/edit.tpl
- /data/Smarty/templates/admin/customer/edit_confirm.tpl
- /data/class_extends/helper_extends/SC_Helper_Customer_Ex.php
- /data/Smarty/templates/default/frontparts/form_personal_input.tpl
- /data/Smarty/templates/default/frontparts/form_personal_confirm.tpl
- /data/Smarty/templates/default/shopping/deliv.tpl
- /data/class_extends/page_extends/shopping/LC_Page_Shopping_Deliv_Ex.php
- /data/Smarty/templates/default/shopping/confirm.tpl
- /data/class_extends/helper_extends/SC_Helper_Purchase_Ex.php
- /data/Smarty/templates/admin/order/edit.tpl
- /data/class_extends/page_extends/admin/order/LC_Page_Admin_Order_Edit_Ex.php
- /data/class_extends/SC_Fpdf_Ex.php
[ 管理画面 ]会員管理 -> 会員登録
必ずしもタイトルで利用するものじゃないけど、参考までにね。
ここでは以下5ファイルを調整します。
/data/Smarty/templates/admin/customer/edit.tpl
133行目付近 eccube.getAddress の引数に addr02 を追加
[html] <a class="btn-normal" href="javascript:;" name="address_input" onclick="eccube.getAddress('<!--{$smarty.const.INPUT_ZIP_URLPATH}-->', 'zip01', 'zip02', 'pref', 'addr01', 'addr02'); return false;">住所入力</a> [/html]
/data/Smarty/templates/admin/customer/edit_confirm.tpl
98行目付近 「addr03」を追加
[html] <td><!--{$arrPref[$arrForm.pref]|h}--><!--{$arrForm.addr01|h}--><!--{$arrForm.addr02|h}--><!--{$arrForm.addr03|h}--></td> [/html]
/html/js/eccube.js
91行目付近 eccube.getAddress の引数に input3 を追加
102行目付近 eccube.putAddress の引数に input3 を追加
114行目付近 eccube.putAddress 引数に input3 を追加
118行目付近 city + town としている行をコメントアウトして、119行目付近と120行目付近で、それぞれ city と town を分ける
[html] eccube.getAddress = function(php_url, tagname1, tagname2, input1, input2, input3) { eccube.putAddress(input1, input2, input3, arrData[0], arrData[1], arrData[2]); eccube.putAddress = function(input1, input2, input3, state, city, town) { //document.form1[input2].value = city + town; document.form1[input2].value = city; document.form1[input3].value = town; [/html]
/data/class_extends/helper_extends/SC_Helper_Customer_Ex.php
基本クラスのソースを利用します。
拡張クラスに
以下のメソッドをコピペしておきます。
- sfCustomerCommonParam
「addr02(住所2)」の下辺りに以下コードを追加します。
場所は最下部でも良いけど、関連がある場所に近くに書いとこうかなと思っただけ。
他の「住所」と違って必須じゃないため「EXIST_CHECK」のエラーチェックを外しておきます。
[html] $objFormParam->addParam('住所3', $prefix . 'addr03', MTEXT_LEN, 'aKV', array('SPTAB_CHECK', 'MAX_LENGTH_CHECK')); [/html]
/data/class_extends/SC_Fpdf_Ex.php
納品書などの出力に利用します。
基本クラスの中身をすべて拡張クラスにコピペします。
setOrderDataメソッド内、「購入者情報」コメントアウトの付近に「order_addr03」を追加します。
[html] $this->lfText(27, 51, $this->arrDisp['order_addr02'] . $this->arrDisp['order_addr03'], 10); [/html]
[ 管理画面 ]受注管理 -> 受注登録
ここでは以下2ファイルを調整します。
インプットが増える分、HTMLのinputに対して「top」クラスを付与することで、見た目がちょっと良くなったりします。
見た目はとりあえずどうでも良いので、ここでは説明を省きます!
/data/Smarty/templates/admin/order/edit.tpl
66行目付近 以下コードの追加
[html] df['shipping_addr03'+shipping_key].value = df.order_addr03.value; [/html]
331行目付近 eccube.getAddressの引数に「order_addr02」を追加
[html] <a class="btn-normal" href="javascript:;" name="address_input" onclick="eccube.getAddress('<!--{$smarty.const.INPUT_ZIP_URLPATH}-->', 'order_zip01', 'order_zip02', 'order_pref', 'order_addr01', 'order_addr02'); return false;">住所入力</a><br /> [/html]
344行目~346行目付近に「order_addr03」用inputを追加
[html] <!--{assign var=key value="order_addr03"}--> <span class="attention"><!--{$arrErr[$key]}--></span> <input type="text" name="<!--{$key}-->" value="<!--{$arrForm[$key].value|h}-->" size="60" class="box60" maxlength="<!--{$arrForm[$key].length}-->" style="<!--{$arrErr[$key]|sfGetErrorColor}-->" /> [/html]
700行目付近 eccube.getAddressの引数に「shipping_addr02[]」を追加
[html] <a class="btn-normal" href="javascript:;" name="address_input" onclick="eccube.getAddress('<!--{$smarty.const.INPUT_ZIP_URLPATH}-->', 'shipping_zip01[<!--{$shipping_index}-->]', 'shipping_zip02[<!--{$shipping_index}-->]', 'shipping_pref[<!--{$shipping_index}-->]', 'shipping_addr01[<!--{$shipping_index}-->]', 'shipping_addr02[<!--{$shipping_index}-->]'); return false;">住所入力</a><br /> [/html]
/data/class_extends/page_extends/admin/order/LC_Page_Admin_Order_Edit_Ex.php
基本クラスのソースを利用します。
拡張クラスに以下変数やメソッドをコピペしておきます。
- $arrShippingKeys
- lfInitParam
$arrShippingKeys に「shipping_addr03」を追加
[html] public $arrShippingKeys = array( 'shipping_id', 'shipping_name01', 'shipping_name02', 'shipping_kana01', 'shipping_kana02', 'shipping_company_name', 'shipping_tel01', 'shipping_tel02', 'shipping_tel03', 'shipping_fax01', 'shipping_fax02', 'shipping_fax03', 'shipping_pref', 'shipping_country_id', 'shipping_zipcode', 'shipping_zip01', 'shipping_zip02', 'shipping_addr01', 'shipping_addr02', 'shipping_addr03', // ここ追加ね 'shipping_date_year', 'shipping_date_month', 'shipping_date_day', 'time_id', ); [/html]
lfInitParamには住所3として2箇所追加。
コメントアウトしてある「お客様情報」と「複数情報」の区分あたり。
[html] // お客様情報 $objFormParam->addParam('住所3', 'order_addr03', MTEXT_LEN, 'KVa', array('SPTAB_CHECK', 'MAX_LENGTH_CHECK')); // 複数情報 objFormParam->addParam('住所3', 'shipping_addr03', MTEXT_LEN, 'KVa', array('SPTAB_CHECK', 'MAX_LENGTH_CHECK')); [/html]
[ マイページ ]会員登録内容変更
ここでは2ファイルを調整します。
/data/Smarty/templates/default/frontparts/form_personal_input.tpl
67行目付近 key8としてaddr03を追加。
[html] <!--{assign var=key8 value="`$prefix`addr03"}--> [/html]
105行目付近 eccube.getAddress の引数に「addr02」を追加
[html] <a href="<!--{$smarty.const.ROOT_URLPATH}-->input_zip.php" onclick="eccube.getAddress('<!--{$smarty.const.INPUT_ZIP_URLPATH}-->', '<!--{$key1}-->', '<!--{$key2}-->', '<!--{$key3}-->', '<!--{$key4}-->', '<!--{$key5}-->'); return false;" target="_blank"> [/html]
/data/Smarty/templates/default/frontparts/form_personal_confirm.tpl
84行目付近 「addr03」を追加
[html] <!--{assign var=key4 value="`$prefix`addr03"}--> [/html]
86行目付近 「addr03」の出力を追加
[html] <!--{$arrPref[$pref_id]|h}--><!--{$arrForm[$key2].value|h}--><!--{$arrForm[$key3].value|h}--><!--{$arrForm[$key4].value|h}--> [/html]
[ 通常ページ ]ショッピング工程
/data/Smarty/templates/default/shopping/deliv.tpl
101行目付近 「addr03」を追加
[html] <!--{$arrPref[$key1]|h}--><!--{$arrAddr[cnt].addr01|h}--><!--{$arrAddr[cnt].addr02|h}--><!--{$arrAddr[cnt].addr03|h}--><br /> [/html]
/data/class_extends/page_extends/shopping/LC_Page_Shopping_Deliv_Ex.php
基本クラスの「action」メソッドをコピペしてカスタマイズします。
コメントアウトしてある「登録済み住所を取得」の配列に「addr03」を追加
[html] // 登録済み住所を取得 $addr = array( array( 'other_deliv_id' => NULL, 'customer_id' => $objCustomer->getValue('customer_id'), 'name01' => $objCustomer->getValue('name01'), 'name02' => $objCustomer->getValue('name02'), 'kana01' => $objCustomer->getValue('kana01'), 'kana02' => $objCustomer->getValue('kana02'), 'company_name' => $objCustomer->getValue('company_name'), 'country_id' => $objCustomer->getValue('country_id'), 'zipcode' => $objCustomer->getValue('zipcode'), 'zip01' => $objCustomer->getValue('zip01'), 'zip02' => $objCustomer->getValue('zip02'), 'pref' => $objCustomer->getValue('pref'), 'addr01' => $objCustomer->getValue('addr01'), 'addr02' => $objCustomer->getValue('addr02'), 'addr03' => $objCustomer->getValue('addr03'),//ここ追加ね 'tel01' => $objCustomer->getValue('tel01'), 'tel02' => $objCustomer->getValue('tel02'), 'tel03' => $objCustomer->getValue('tel03'), ) ); [/html]
/data/Smarty/templates/default/shopping/confirm.tpl
184行目付近 「order_addr03」を追加
[html] <td><!--{$arrPref[$arrForm.order_pref]}--><!--{$arrForm.order_addr01|h}--><!--{$arrForm.order_addr02|h}--><!--{$arrForm.order_addr03|h}--></td> [/html]
292行目付近 「shipping_addr03」を追加
[html] <td><!--{$arrPref[$shippingItem.shipping_pref]}--><!--{$shippingItem.shipping_addr01|h}--><!--{$shippingItem.shipping_addr02|h}--><!--{$shippingItem.shipping_addr03|h}--></td> [/html]
/data/class_extends/helper_extends/SC_Helper_Purchase_Ex.php
基本クラスのソースを利用します。
拡張クラスに以下変数やメソッドをコピペしておきます。
- $arrShippingKey
- copyFromCustomer
$arrShippingKeyに「addr03」を追加。
[html] public $arrShippingKey = array( 'name01', 'name02', 'kana01', 'kana02', 'company_name', 'sex', 'zip01', 'zip02', 'country_id', 'zipcode', 'pref', 'addr01', 'addr02', 'addr03', 'tel01', 'tel02', 'tel03', 'fax01', 'fax02', 'fax03', ); [/html]
copyFromCustomerメソッドの引数$keysに「addr03」を追加
[html] public function copyFromCustomer(&$dest, &$objCustomer, $prefix = 'order', $keys = array('name01', 'name02', 'kana01', 'kana02', 'company_name', 'sex', 'zip01', 'zip02', 'country_id', 'zipcode', 'pref', 'addr01', 'addr02', 'addr03', 'tel01', 'tel02', 'tel03', 'fax01', 'fax02', 'fax03', 'job', 'birth', 'email', ) ) [/html]
まとめ
dtb_csv テーブルも着手するべきだったけど、とりあえず今回は必要はなかったから作業はしなかった。
デザインはPCレイアウトのみを記載したけど、モバイルもスマートフォンも基本的には同じ。
内容をまとめるのに、思った以上に時間がかかってしまったから、また別の日にでもまとめられると良いですね。