inexio(アイネクシオ)

私たちはネットワークから新しいアイデアを創出します

EC-CUBE 住所項目の追加

      2015/05/19

2015/05/19にプラグインに登録されました。
住所項目追加機能(EC-CUBEプラグイン)

EC-CUBEを利用していて、基幹システムや他のシステムとの連動で、住所項目を別の形に切り分けたいなどの要望があったりします。デフォルトだと「都道府県」「市区町村名」「番地・ビル名」になっていて、例えば「山梨県甲府市中央3丁目10-9 フラワーローム2F」を当てはめると以下のようになります。

都道府県: 山梨県
市区町村名: 甲府市中央
番地・ビル名: 3丁目10-9 フラワーローム2F

これでも基本的には問題ないのかもしれませんが、項目を増やしてみたいと思うこともあったりします。
例えば以下のようにやってみたいと考えたりもするわけです。

都道府県: 山梨県
市区町村名: 甲府市
町域・番地: 中央3丁目10-9
ビル名など: フラワーローム2F

やりたいことと環境

  • 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 を "アパート・マンション名称"

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', 'フロント表示関連');

②dtb_customer の調整

会員情報テーブルに住所カラムを追加します。
カラム名は「addr03」としてみます。
どうでもよいですが、念のため「addr02」の次に追加しておきます。

ALTER TABLE  `dtb_customer` ADD  `addr03` TEXT CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL AFTER  `addr02` ;

③dtb_shipping の調整

配送先テーブルに住所カラムを追加します。
カラム名は「shipping_addr03」としてみます。
こちらも念のため「shipping_addr02」の次に追加しておきます。

ALTER TABLE `dtb_shipping` ADD `shipping_addr03` TEXT NULL DEFAULT NULL AFTER `shipping_addr02`;

④dtb_order_temp の調整

dtb_order_temp にカラムを追加します。
カラム名は「order_addr03」で、「order_addr02」の次に追加します。

ALTER TABLE `dtb_order_temp` ADD `order_addr03` TEXT NULL DEFAULT NULL AFTER `order_addr02`;

⑤dtb_order の調整

dtb_order にカラムを追加します。
カラム名は「order_addr03」で、「order_addr02」の次に追加します。

ALTER TABLE `dtb_order` ADD `order_addr03` TEXT NULL DEFAULT NULL AFTER `order_addr02`;

⑥dtb_other_deliv の調整

dtb_other_deliv にカラムを追加します。
カラム名は「addr03」で、「addr02」の次に追加します。

ALTER TABLE `dtb_other_deliv` ADD `addr03` TEXT NULL DEFAULT NULL AFTER `addr02`;

ファイルの調整

クラスファイルやテンプレートを調整します。
調整が必要なファイルは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 を追加

<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>

/data/Smarty/templates/admin/customer/edit_confirm.tpl

98行目付近 「addr03」を追加

<td><!--{$arrPref[$arrForm.pref]|h}--><!--{$arrForm.addr01|h}--><!--{$arrForm.addr02|h}--><!--{$arrForm.addr03|h}--></td>

/html/js/eccube.js

91行目付近 eccube.getAddress の引数に input3 を追加
102行目付近 eccube.putAddress の引数に input3 を追加
114行目付近 eccube.putAddress 引数に input3 を追加
118行目付近 city + town としている行をコメントアウトして、119行目付近と120行目付近で、それぞれ city と town を分ける

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;

/data/class_extends/helper_extends/SC_Helper_Customer_Ex.php

基本クラスのソースを利用します。
拡張クラスに
以下のメソッドをコピペしておきます。

  • sfCustomerCommonParam

「addr02(住所2)」の下辺りに以下コードを追加します。
場所は最下部でも良いけど、関連がある場所に近くに書いとこうかなと思っただけ。
他の「住所」と違って必須じゃないため「EXIST_CHECK」のエラーチェックを外しておきます。

$objFormParam->addParam('住所3', $prefix . 'addr03', MTEXT_LEN, 'aKV', array('SPTAB_CHECK', 'MAX_LENGTH_CHECK'));

/data/class_extends/SC_Fpdf_Ex.php

納品書などの出力に利用します。
基本クラスの中身をすべて拡張クラスにコピペします。
setOrderDataメソッド内、「購入者情報」コメントアウトの付近に「order_addr03」を追加します。

$this->lfText(27, 51, $this->arrDisp['order_addr02'] . $this->arrDisp['order_addr03'], 10);

[ 管理画面 ]受注管理 -> 受注登録

ここでは以下2ファイルを調整します。
インプットが増える分、HTMLのinputに対して「top」クラスを付与することで、見た目がちょっと良くなったりします。
見た目はとりあえずどうでも良いので、ここでは説明を省きます!

/data/Smarty/templates/admin/order/edit.tpl

66行目付近 以下コードの追加

df['shipping_addr03'+shipping_key].value = df.order_addr03.value;

331行目付近 eccube.getAddressの引数に「order_addr02」を追加

<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 />

344行目~346行目付近に「order_addr03」用inputを追加

<!--{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}-->" />

700行目付近 eccube.getAddressの引数に「shipping_addr02[]」を追加

<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 />

/data/class_extends/page_extends/admin/order/LC_Page_Admin_Order_Edit_Ex.php

基本クラスのソースを利用します。
拡張クラスに以下変数やメソッドをコピペしておきます。

  • $arrShippingKeys
  • lfInitParam

$arrShippingKeys に「shipping_addr03」を追加

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',
);

lfInitParamには住所3として2箇所追加。
コメントアウトしてある「お客様情報」と「複数情報」の区分あたり。

// お客様情報
$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'));

[ マイページ ]会員登録内容変更

ここでは2ファイルを調整します。

/data/Smarty/templates/default/frontparts/form_personal_input.tpl

67行目付近 key8としてaddr03を追加。

<!--{assign var=key8 value="`$prefix`addr03"}-->

105行目付近 eccube.getAddress の引数に「addr02」を追加

<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">

/data/Smarty/templates/default/frontparts/form_personal_confirm.tpl

84行目付近 「addr03」を追加

<!--{assign var=key4 value="`$prefix`addr03"}-->

86行目付近 「addr03」の出力を追加

<!--{$arrPref[$pref_id]|h}--><!--{$arrForm[$key2].value|h}--><!--{$arrForm[$key3].value|h}--><!--{$arrForm[$key4].value|h}-->

[ 通常ページ ]ショッピング工程

/data/Smarty/templates/default/shopping/deliv.tpl

101行目付近 「addr03」を追加

<!--{$arrPref[$key1]|h}--><!--{$arrAddr[cnt].addr01|h}--><!--{$arrAddr[cnt].addr02|h}--><!--{$arrAddr[cnt].addr03|h}--><br />

/data/class_extends/page_extends/shopping/LC_Page_Shopping_Deliv_Ex.php

基本クラスの「action」メソッドをコピペしてカスタマイズします。
コメントアウトしてある「登録済み住所を取得」の配列に「addr03」を追加

// 登録済み住所を取得
$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'),
    )
);

/data/Smarty/templates/default/shopping/confirm.tpl

184行目付近 「order_addr03」を追加

<td><!--{$arrPref[$arrForm.order_pref]}--><!--{$arrForm.order_addr01|h}--><!--{$arrForm.order_addr02|h}--><!--{$arrForm.order_addr03|h}--></td>

292行目付近 「shipping_addr03」を追加

<td><!--{$arrPref[$shippingItem.shipping_pref]}--><!--{$shippingItem.shipping_addr01|h}--><!--{$shippingItem.shipping_addr02|h}--><!--{$shippingItem.shipping_addr03|h}--></td>

/data/class_extends/helper_extends/SC_Helper_Purchase_Ex.php

基本クラスのソースを利用します。
拡張クラスに以下変数やメソッドをコピペしておきます。

  • $arrShippingKey
  • copyFromCustomer

$arrShippingKeyに「addr03」を追加。

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',
);

copyFromCustomerメソッドの引数$keysに「addr03」を追加

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',
    )
)

まとめ

dtb_csv テーブルも着手するべきだったけど、とりあえず今回は必要はなかったから作業はしなかった。
デザインはPCレイアウトのみを記載したけど、モバイルもスマートフォンも基本的には同じ。
内容をまとめるのに、思った以上に時間がかかってしまったから、また別の日にでもまとめられると良いですね~。

 - EC-CUBE, PHP ,