【PHP】Symfony2のFormBuilderにデフォルト値を設定する方法

※投稿時の Symfony のバージョンは 2.7.9 、EC-CUBE のバージョンは3.0.10です。

というわけで、今回は PHP のフレームワーク Symfony2 に関するメモです。
仕事で使っている関係上いろいろと詰まることがあり、今日もちょっとしたことで詰まってしまいました。
主に「EC-CUBE3」で使っているので、それを元にして書いておきます。

shot2ss20160714205855672

やりたかったことは「FromBuilder の時にデフォルト値を設定する」です。
(プレースホルダとは別で、画面表示時からフォームに値が設定されている状態です)
普通なら getForm() した後に setData() すれば問題ないのですが、EC-CUBE のフックポイント的に FormBuilder の状態でいじれると便利だったりします。

テストとして、会員登録画面の「生年月日」欄の年をデフォルトで「2000」にしようと思います。
そこでこんなコードを書きましたが、フォームにデフォルト値として設定されません。

$Customer = $app['eccube.repository.customer']->newCustomer();

$builder = $app['form.factory']->createBuilder('entry', $Customer);
$builder->get('birth')->get('year')->setData(2000);

ぐぐったらスタックオーバーフローにそんな話題がありました。

http://stackoverflow.com/questions/18870866/symfony-2-3-form-getdata-doesnt-work-in-subforms-collections

setDataLocked() なる関数でロックしてあげないと getForm() 時に消える(?)らしいです。
ならこれでロックすればOKですね。

$Customer = $app['eccube.repository.customer']->newCustomer();

$builder = $app['form.factory']->createBuilder('entry', $Customer);
$builder->get('birth')->get('year')->setData(2000)->setDataLocked(true);

shot2ss20160714205839398

今度はデフォルト値としてしっかり入りました!
値を変えて確認画面に行ってもちゃんと変わったので、大丈夫かと思われます。

ちなみに getForm() 後であれば普通に $form->get(‘フィールド名’)->setData() で設定できます。
但し handleRequest() してしまうと変えられなくなります。
また、「プラグインからフックして設定する」などの理由がなければ Type クラスの $buider->add() のオプションで指定しまう方が確実です。

まとめ

そんなわけで、Symfony2 の setData() に関するお話でした。
Symfony2 は初見ではとっつきにくい割に日本語サイトが少ないので厳しいです。
EC-CUBE3 のフレームワークとしても使われているので、もっと日本語サイトも増えてくれるといいなーなんて思います。

ゲーム開発とは関係ありませんが、今後も何か詰まったことがあったらメモして忘れないようにしたいです。
特に PHP は一生付き合っていく言語になりそうなので、尚更ですね。
そもそもゲーム開発だけでは話題が続かなくなってきているので、いろいろ話題を織り交ぜていくブログに方向転換しようかと思います。

カテゴリー PHP

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

*