春咲さんのメモ。

自分メモ的な。主にPHPについて。github:mindlessdoll(冬眠してるけど)

Symfony2 Form前進しました。

はい、やっとなんとかなりましたのでまとめます。

まず、あのへんなポップアップ↓

f:id:aliceDream:20140814183412p:plain

の消し方。ミソは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の記述のみです。

そうするとですね…

f:id:aliceDream:20140819100450p:plain

って感じでメッセージがちゃんと出るんですよ!!!

しかもー、

f:id:aliceDream:20140819100710p:plain

フリガナもこれで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タグに反応するってどういうこと??(なので<が<になってる↑)