フォームの作成方法について。
とりあえず基本的な作成方法について記載する。
※気が向いたらFormTypeを作成する方法を別途まとめる。
フォームの作成
フォームを作成するメソッドをprivateで指定する。
private function createCommentForm()
{
return $this->createFormBuilder()
->add('comment', 'textarea')
->add('submit', 'submit',[
'label' => '送信'
])
->getForm();
}
先ほど指定したメソッドをrenderでビュー表示する際に呼び出す。
なお、下記は合わせてDBに登録されているコメントを取得する記述も加えている。
/**
* @Route("/")
* @Method("get")
*/
public function indexAction()
{
// 投稿一覧を取得
$em = $this->getDoctrine()->getManager();
$testRepository = $em->getRepository('AppBundle:Test');
$commentList = $testRepository->findAll();
return $this->render('Testpage/index.html.twig',
[
// フォーム項目を生成
'form' => $this->createCommentForm()->createView(),
'commentList' => $commentList
]
);
}
入力フォームのDBへの登録
postした時にDBに登録する処理。
/**
* @Route("/")
* @Method("post")
*/
public function indexPostAction(Request $request)
{
$form = $this->createCommentForm();// フォーム定義を取得
$form->handleRequest($request); // 送信情報をフォームオブジェクトに取り込む
if ($form->isValid()) {
$data = $form->getData();// 入力項目の取得
$test = new Test();
$test->setComment($data['comment']);
// date()はstringを返すため、DateTimeオブジェクトを生成する
$test->setCreatedAt(new \DateTime());
$test->setUpdatedAt(new \DateTime());
$em = $this->getDoctrine()->getManager();
$em->persist($test);
$em->flush();
return $this->redirect($this->generateUrl('app_testpage_index'));
}
// 送信失敗
return $this->redirect($this->generateUrl('app_testpage_index'));
}
フォーム項目のclassの指定
先ほどのcreateCommentFormメソッド内で、引数に配列を追加して定義する。
$this->createFormBuilder()->add('comment', 'textarea', ['attr' => ['class' => 'form-control']])