Symfony2 Form前進しました。
はい、やっとなんとかなりましたのでまとめます。
まず、あのへんなポップアップ↓
の消し方。ミソはTypeの指定
namespace hoge\fugaBundle\Form\Type; use Symfony\Component\Form\AbstractType; use Symfony\Component\Form\FormBuilderInterface; class InquireType extends AbstractType { public function buildForm(FormBuilderInterface $builder, array $options) { $builder->add('firstName','text', array("required"=>false)); $builder->add('lastName','text', array("required"=>false)); $builder->add('pref', 'choice',array( 'choices' => array( 'tokyo' => '東京', 'saitama' => '埼玉', 'kanagawa'=> '神奈川', ), 'multiple' => false, 'expanded' => false, )); } public function getDefaultOptions(array $options) { return array('data_class' => 'foge\fugaBundle\Entity\Inquire'); } public function getName() { return 'inquire'; } }
この指定↓が必要
array("required"=>false)
前回と違ってちょっとフィールド増やしました。nameをfirstNameとlastNameに分割したんですけどね。
validation.yml
hoge\fugaBundle\Entity\Inquire: properties: firstName: - NotBlank: { message: "つ入力" } lastName: - NotBlank: { message: "つカナ入力" } - Regex: { pattern: "/^[ァ-ヶーa-zA-Z]+$/u", message: "フリガナ(名)を正しく入力してください" } pref: - NotNull: ~
あれ、lastNameの役割がフリガナになってる…。まぁ、いいかw
で、問題のController
public function inquireAction() { $errors = ''; $inquire = new Inquire(); $form = $this->createForm(new InquireType(), $inquire); $request = $this->getRequest(); if ($request->getMethod() == 'POST') { $form->bind($request); $validator = $this->get('validator'); $errors = $validator->validate($request); if (count($errors) > 0) { return $this->render('fugaBundle:Inquire:input.html.twig', array( 'form' => $form->createView(), 'errors' => $errors )); } if ($form->isValid()) { return $this->render('fugaBundle:Inquire:confirm.html.twig', array('data' => $form->getData(), 'form' => $form->createView(), )); } } return $this->render('fugaBundle:Inquire:input.html.twig', array( 'form' => $form->createView(), 'errors' => $errors )); }
的な。ちょっとこの辺は要改良の余地ありなのですが。暫定です。Entityは単純なgetter、setterの記述のみです。
そうするとですね…
って感じでメッセージがちゃんと出るんですよ!!!
しかもー、
フリガナもこれでOK(デザインが変なのは今は問題じゃない)。
一応Twigも載せておきますね。
input.html.twig
{% extends "fugaBundle::layout.html.twig" %} {% block title "Inquire" %} {% block content_header 'Inquire' %} {% block content %} <form action="{{ path('inquire') }}" method="post" name="caseInquire"> {% include 'fugaBundle:Inquire:Form/form_errors.html.twig' %} {{ form_widget(form) }} <input type="submit" /></form> {% endblock %}
form_errors.html.twig
{% block form_errors %} {% spaceless %} {% if errors|length > 0 %} <ul>{% for error in errors %} <li>{{ error.message }}</li> {% endfor %} </ul> {% endif %} {% endspaceless %} {% endblock form_errors %}
やっとなんとか形になったー。後はココにEmailとか追加してですね…なんとか山は過ぎた…と思いたい…
て、いうかさ…はてブロって、preタグ使ってるのにHTMLタグに反応するってどういうこと??(なので<が<になってる↑)