Because We Love Happy Coding

フリーライターからエンジニアへ。発信力だけあり余ってる感じ

ECCUBE3 のTelType、FaxType、ZipType、KanaTypeには注意が必要

faxタイプはtelタイプでもある。

TelTypeExtensionで、->remove('tel02')->remove('tel03')->add('tel01','tel',array())をしてみたら、なぜかfaxの中にもtel01が追加されている。

試しにTelTypeExtension->add('tel01','tel',array())を削除してみたらfaxの中のtel01も消えた。

どうもfaxがtelタイプを採用しているので、一緒に登録されてしまうらしい。

FaxTypeはあるけど使われていない

調べたところ、faxタイプというものは既に存在していないことがわかった。FaxType.phpを見ると、削除予定とある。

$builder->add('fax', 'tel', array())をよく見ると、第二引数のFormTypeにtelを指定している。

このadd()から何が起きるかというと、faxという名前のTelTypeを作成し、その中にさらにfax01fax02fax03というtextフォームを作成している。

そもそもTelType.phpの挙動自体が、3連でフォームを作成するように設計されている。どんな名前で作っても、連番で01~03を生成するのだ。だからhogeで作れば、その中にはhoge01hoge02hoge03の3つが作られる。

FaxTypeExtensionは作れない

FaxTypeExtensionを作ると、「削除予定の」FaxTypeを拡張してしまうため、一向にfax01fax03に影響を与えることができない。逆にTelTypeExtensionを作ると、今度はtelfaxが同時に作用を受ける。

なので、TelTypeTelTypeExtensionでは、telfaxに共通のオプションだけ指定しておき、Controllerから呼び出す際にtel固有のオプション、fax固有のオプションを追加してやるのがよい。あるいは、イベントで付与するか、テンプレートで付与するか、といった選択肢もある。

TelTypeはEventListenerで「3つとも入力必須」を指定している

TelTypeはEventListenerによって、tel01tel02tel03すべてが入力されないと弾くよう、設定されている。海外向けサイトでtel02tel03を削除しようとした時、プラグインからこのEventListenerを削除する方法がどうしてもわからなかったので、非常に苦労した。(結局できなかった)

ZipType

これもZipTypeの中にzip01zip02が作られる。

KanaType

KanaTypegetParent()nameを返すようになっている。つまり、NameTypeの子要素なのだ。そのため、KanaTypeExtensionを使って変更しようとしてもうまくいかない場合がある。

CustomerAddressTypeEntryTypeからadd()されているので、CustomerAddressTypeExtensionEntryTypeExtensionを作って、そこで改めてadd()し直す方がいいようだ。