Symfony3でDBの値から動的にChoiceTypeのvalueを作成
地政学と全く関係なくてすみません。
うまくいったので備忘録として残させてください。
Symfony3でDBの値から動的にChoiceTypeのvalueを作成
symfony3でフォームを作る時にhtmlで言えば<option>と同じ動きをするものが作りたかったのだけどなかなかうまくいかずに悩んでいた。
このブログの更新そっちのけでPCと向き合っていたところなんとかやり方が分かったのでメモしておきます。
ちなみに何をしたいのかというとヨガやピラティスの予約サイトをSymfony3の練習を兼ねて作ってるのですが、肝心の予約画面を作る時にレンダリングするフォームを作成する段階でformBuilder()内に直書きで必要なvalue(レッスンの種類)を書いていました。
しかしこれでは新たにレッスンが追加されたり、なくなったりした時にフォームの内部を書き換えなければならない。それは面倒くさいし汎用性がない。
ということでデータベースに追加した値が即フォームに反映されるようにしたかったというわけです。
ではいざ、
⑴AppBundle/src/Reservation.controllerに使用するEntityをuseする。
use Symfony\Component\Form\Extension\Core\Type\DateTimeType;
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
use AppBundle\Entity\Lesson;
(2)同ファイル内で各オブジェクトの名前を取得する関数を作成する。
private function nameChoices()
{
$choices = [];
$lessonRepository = $this->getDoctrine()->getRepository("AppBundle:Lesson");
$lessonObjects = $lessonRepository->findAll();
foreach ($lessonObjects as $lessonObj) {
$choices[$lessonObj->getName()] = $lessonObj->getId();
}
return $choices;
}
(3)レンダリングするフォームを作成する。(練習なのでここではレッスン名のみ)
public function createReserveForm()
{
return $this->createFormBuilder(new Lesson())
->add('name',ChoiceType::Class, [
'choices' => $this->nameChoices()
])
->getForm();
}
(4)ビューにフォームを渡す。
public function indexAction()
{
return $this->render('Reservation/lesson.html.twig',
['form' => $this->createReserveForm()->createView()]
);
}
(5)表示したいデータはこちら
MariaDB [pilates]> select * from lesson;
+----+--------------------+---------------------+-----------------------------+
| id | name | date | place |
+----+--------------------+---------------------+-----------------------------+
| 1 | 瞑想ピラティス | 2016-09-21 10:00:00 | 小机スタジオ
| 2 | 温泉ヨガ | 2016-10-11 00:00:00 | 熱海スタジオ |
| 3 | ペットとピラティス | 2016-10-13 10:00:00 | 代々木上原スタジオ |
----+--------------------+---------------------+-----------------------------+
この"name"カラムの3件が出てくれればOK
(6)では表示を確認
出てきた!
(7)DBに一つ追加してそれがきちんと反映されるかもテスト(追加のところは省略です)
「夫婦限定教室」というものを追加してみました。
もう一度表示を確認。
最下段に増えてます!
これでまたほんの少しできることが増えました!
本日は以上です!