ゴマちゃんフロンティア

アザラシが大好きなエンジニアの開発日記です

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

time 2016/07/14

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

【2017/04/23 追記】
・記事のレイアウトを修正しました。
・現在のEC-CUBEとはフックポイントのシステムが異なるため、参考にならない可能性があります。

というわけで、今回は 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 は一生付き合っていく言語になりそうなので、尚更ですね。
そもそもゲーム開発だけでは話題が続かなくなってきているので、いろいろ話題を織り交ぜていくブログに方向転換しようかと思います。

down

コメントする