2012-03-22
■[PHP][Symfony2]サービスに登録したカスタムFormTypeを使う
via. カスタムフォームフィールドタイプの作成方法 | Symfony2日本語ドキュメント
やってみたメモ。基本的な流れは以下のとおり。
手順1:Symfony\Component\Form\AbstractTypeのサブクラスを作成する
コード全体は以下のとおり。AbstractTypeクラスはSymfony\Component\Form\FormTypeInterfaceをgetNameメソッドを除いて実装しているため、ここでgetNameメソッドを実装する必要がある。
<?php namespace Acme\FormTypeBundle\Form\Type; use Symfony\Component\Form\AbstractType; /** * 性別FormType * * services.ymlで以下のように定義 * * services: * form.type.gender: * class: Acme\FormTypeBundle\Form\Type\GenderType * arguments: * - "%genders%" * tags: * - { name: form.type, alias: gender } * * @version $Id$ */ class GenderType extends AbstractType { private $genderChoices; public function __construct(array $genderChoices) { $this->genderChoices = $genderChoices; } public function getDefaultOptions(array $options) { return array( 'choices' => $this->genderChoices ); } public function getName() { return 'acme_formtypebundle_gendertype'; } /** * フォームでの表示形式を指定 */ public function getParent(array $options) { return 'choice'; } }
手順2:Bundle/Resources/config/services.xml(もしくはservices.yml)に作成したFormTypeをサービスとして登録する
カスタムフォームフィールドタイプの作成方法 | Symfony2日本語ドキュメントではGenderTypeのコンストラクタに渡す引数をapp/config/config.ymlに定義しているが、Bundle下のservices.(yml|xml)にも定義できる。以下、Bundle/Resources/config/services.xmlに定義した例。
<?xml version="1.0" ?> <container xmlns="http://symfony.com/schema/dic/services" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd"> <parameters> <parameter key="genders" type="collection"> <parameter key="m">男性</parameter> <parameter key="f">女性</parameter> </parameter> </parameters> <services> <service id="acme_formtype.type.gender" class="Acme\FormTypeBundle\Form\Type\GenderType"> <argument>%genders%</argument> <tag name="form.type" alias="gender" /> </service> </services> </container>
手順3:FormTypeで呼び出す
FormBuilderクラスのaddメソッドの第2引数に登録した際のtag.aliasを指定する。ちなみに、getParentメソッドをオーバーライドしない場合の戻り値は"form"になっている。
<?php namespace Acme\FormTypeBundle\Form; use Symfony\Component\Form\AbstractType; use Symfony\Component\Form\FormBuilder; use Acme\FormTypeBundle\Entity\MPrefRepository; /** * formtype登録用Formクラス * * @version $Id$ */ class FormtypeType extends AbstractType { public function buildForm(FormBuilder $builder, array $options) { $builder /** * サービスに登録したFormType"gender"を利用する */ ->add('gender', 'gender', array( 'label' => '性別', 'required' => true, )) ; } public function getName() { return 'acme_formtypebundle_formtypetype'; } }
これで
のように表示される。
トラックバック - http://d.hatena.ne.jp/shimooka/20120322/1332390690
リンク元
- 284 http://pipes.yahoo.com/pipes/pipe.info?_id=f8e50936209277c7946c9bc16b988bf7
- 121 https://www.google.co.jp/
- 67 http://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&ved=0CCYQFjAA&url=http://d.hatena.ne.jp/shimooka/20120322/1332390690&ei=4gNwT8vgLsayiQfN-b3nBw&usg=AFQjCNGu5djZ7WIm9zhrsdp0_PewriONSA&sig2=Boy41ihE8oHM6TC43SRSPw
- 31 http://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&source=web&cd=30&ved=0CHoQFjAJOBQ&url=http://d.hatena.ne.jp/shimooka/&ei=ygZwT67WGc7omAXa4KWOBg&usg=AFQjCNH2BB9VFMygkW9Qp4c-Fuhp7ddbYA&sig2=5AswTjgpgMgW8qgg1G84kA
- 29 http://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&source=web&cd=25&ved=0CG4QFjAEOBQ&url=http://d.hatena.ne.jp/shimooka/20120322/1332391845&ei=Ndq0T8DeEZGimQW2o9T9Dw&usg=AFQjCNHFTOJacVrzuaOhirtC8vZo7wK8VA&sig2=wgXcceCxMvuidagqc77ADQ
- 24 http://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&source=web&cd=4&ved=0CGEQFjAD&url=http://d.hatena.ne.jp/shimooka/20120322/1332390690&ei=-8yrT7vlKc3jmAXQ9cXhBA&usg=AFQjCNGu5djZ7WIm9zhrsdp0_PewriONSA
- 23 http://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&source=web&cd=6&ved=0CFkQFjAF&url=http://d.hatena.ne.jp/shimooka/20120322/1332390690&ei=_zp8T8GbLIbumAW86bDZCw&usg=AFQjCNGu5djZ7WIm9zhrsdp0_PewriONSA&sig2=8vh7qKizl9cA3XXPIgAuoQ
- 20 http://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&source=web&cd=5&sqi=2&ved=0CEwQFjAE&url=http://d.hatena.ne.jp/shimooka/20120322/1332391845&ei=kXhxT9aKBdHqmAWEpL2xDw&usg=AFQjCNHFTOJacVrzuaOhirtC8vZo7wK8VA&sig2=SOrBgoG31Pn1GcKg8_Jvmw
- 18 http://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&source=web&cd=7&ved=0CG4QFjAG&url=http://d.hatena.ne.jp/shimooka/20120322/1332391845&ei=F7xyT8bSKqrsmAWFw5y0Dw&usg=AFQjCNHFTOJacVrzuaOhirtC8vZo7wK8VA&sig2=HSJJE6Kf0iWx5aIqBwNthg
- 12 http://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&frm=1&source=web&cd=19&ved=0CFQQFjAIOAo&url=http://d.hatena.ne.jp/shimooka/201009&ei=KZdxT93xH6-JmQWts4jaDw&usg=AFQjCNEGp1udvLEFlQRMhL4KN93lLM5hHg&sig2=PH6rORBHUHY2pv2K02T3BA








