EC-CUBE 住所項目の追加
住所項目追加機能(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レイアウトのみを記載したけど、モバイルもスマートフォンも基本的には同じ。
内容をまとめるのに、思った以上に時間がかかってしまったから、また別の日にでもまとめられると良いですね。



