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
を作成し、その中にさらにfax01
、fax02
、fax03
というtext
フォームを作成している。
そもそもTelType.php
の挙動自体が、3連でフォームを作成するように設計されている。どんな名前で作っても、連番で01~03を生成するのだ。だからhoge
で作れば、その中にはhoge01
、hoge02
、hoge03
の3つが作られる。
FaxTypeExtensionは作れない
FaxTypeExtension
を作ると、「削除予定の」FaxType
を拡張してしまうため、一向にfax01
~fax03
に影響を与えることができない。逆にTelTypeExtension
を作ると、今度はtel
とfax
が同時に作用を受ける。
なので、TelType
やTelTypeExtension
では、tel
とfax
に共通のオプションだけ指定しておき、Controller
から呼び出す際にtel
固有のオプション、fax
固有のオプションを追加してやるのがよい。あるいは、イベントで付与するか、テンプレートで付与するか、といった選択肢もある。
TelTypeはEventListenerで「3つとも入力必須」を指定している
TelType
はEventListenerによって、tel01
、tel02
、tel03
すべてが入力されないと弾くよう、設定されている。海外向けサイトでtel02
、tel03
を削除しようとした時、プラグインからこのEventListenerを削除する方法がどうしてもわからなかったので、非常に苦労した。(結局できなかった)
ZipType
これもZipType
の中にzip01
、zip02
が作られる。
KanaType
KanaType
はgetParent()
でname
を返すようになっている。つまり、NameType
の子要素なのだ。そのため、KanaTypeExtension
を使って変更しようとしてもうまくいかない場合がある。
CustomerAddressType
やEntryType
からadd()
されているので、CustomerAddressTypeExtension
やEntryTypeExtension
を作って、そこで改めてadd()
し直す方がいいようだ。