Home | Symfony2Doc »リファレンスドキュメント »Form Type リファレンス »choice フィールドタイプ

コンテンツ上部に更新日の記載のないページは、翻訳の内容が2.0相当のものになっております。最新の内容は原文のページをご確認ください。

Note

  • 対象バージョン:2.4 (2.0以降)
  • 翻訳更新日:2013/12/30

choice フィールドタイプ

多目的フィールドはユーザーが一つ以上の選択肢を”選択”することができるようにするために使用します。 select タグ、 radio ボタン、または checkbox として表示されます。

このフィールドを使用するには、choice_list または choices オプションの どちらか を指定する必要があります。

対応するタグ さまざまなタグに対応 (下記参照)
オプション
継承された オプション
親タイプ form
クラス ChoiceType

利用例

このフィールドを使用する最も簡単な方法は、 choices オプションで選択肢を直接指定することです。 配列のキーは実際にセットされる基礎となるオブジェクトの値(例えば m )となり、一方、配列の値(例えば Male )はフォーム上で表示されます。

$builder->add('gender', 'choice', array(
    'choices'   => array('m' => 'Male', 'f' => 'Female'),
    'required'  => false,
));

multipletrue に設定することで、複数の値を選択することが出来ます。ウィジェットが複数選択の select タグとして表示されるか、一連の checkbox として表示するかは expanded オプションによります。:

$builder->add('availability', 'choice', array(
    'choices'   => array(
        'morning'   => 'Morning',
        'afternoon' => 'Afternoon',
        'evening'   => 'Evening',
    ),
    'multiple'  => true,
));

choice_list オプションを使うことで、一つのオブジェクトでウィジェットの選択肢を指定できます。

セレクトタグ、チェックボックス、ラジオボタン

このフィールドは expandedmultiple オプションに応じて、いくつかの異なった HTML フィールドのうちの一つが表示されます。:

要素タイプ expanded multiple
セレクトタグ false false
セレクトタグ ( multiple 属性有) false true
ラジオボタン true false
チェックボックス true true

フィールドオプション

choices

データ型: array デフォルト: array()

このオプションはこのフィールドで使用されるべき選択肢を特定する最も基本的な方法です。 choices オプションは一つの配列で、配列のキーはアイテムの値であり、配列の値はアイテムのラベルです。:

$builder->add('gender', 'choice', array(
    'choices' => array('m' => 'Male', 'f' => 'Female')
));

choice_list

データ型: Symfony\Component\Form\Extension\Core\ChoiceList\ChoiceListInterface

これはこのフィールドで使われるオプションを特定する一つの方法です。 choice_list オプションは ChoiceListInterface のインスタンスでなければなりません。 より高度な例として、選択肢を供給するためそのインターフェイスを実装したカスタムクラスを作成することができます。

multiple

データ型: Boolean デフォルト: false

true の場合、(一つの選択肢だけを選ぶのと対照的に)複数の選択肢が選択可能になります。 expanded オプションの値によって、 true の場合はセレクトタグかチェックボックスで表示されます。 false の場合はセレクトタグかラジオボタンとなります。戻り値は配列となります。

expanded

データ型: Boolean デフォルト: false

もし true の場合、( multiple の値により)ラジオボタンかチェックボックスが表示されます。 false の場合、 select 要素が表示されます。

preferred_choices

データ型: array デフォルト: array()

このオプションが指定されていた場合、すべての選択肢の一部がセレクトメニューの最上部に移動します。以下は “Baz” オプションが最上部に移動し、それと残りの選択肢の間にセパレーターがつきます。:

$builder->add('foo_choices', 'choice', array(
    'choices' => array('foo' => 'Foo', 'bar' => 'Bar', 'baz' => 'Baz'),
    'preferred_choices' => array('baz'),
));

ここで注意すべきは好みの選択肢は select 要素で表示されたときにのみ意味を持つことです(すなわち expandedfalse )。この好みの選択肢と通常の選択肢は点線(すなわち ------------------- )によって明示的に分離されます。これは表示する際に編集することが出来ます。:

  • Twig
    {{ form_widget(form.foo_choices, { 'separator': '=====' }) }}
    
  • PHP
    <?php echo $view['form']->widget($form['foo_choices'], array('separator' => '=====')) ?>
    

empty_value

データ型: string or Boolean

New in version 2.3: Symfony 2.3 から、 expanded オプションが true の場合でも空の値がサポートされました。

このオプションは特別な「空の」選択肢(例 “選択肢を選んで下さい” )がセレクトウィジェットの一番上に表示されるかどうかを決定します。このオプションは multiple オプションが false の場合にのみ適用されます。

  • テキストとして”選択肢を選んで下さい”との空の値を追加します。:

    $builder->add('states', 'choice', array(
        'empty_value' => '選択肢を選んで下さい',
    ));
    
  • 「空の」値の選択肢が表示されないことを保証します。:

    $builder->add('states', 'choice', array(
        'empty_value' => false,
    ));
    

empty_value を設定しないままで、 required オプションが false の場合にのみ空の選択肢(テキスト無し)が自動的に追加されます。:

// 空の選択肢(テキスト無し)が追加されます
$builder->add('states', 'choice', array(
    'required' => false,
));

継承されたオプション

以下のオプションは form タイプを継承しています:

required

データ型: Boolean デフォルト: true

trueの場合は HTML5 の required 属性 がレンダリングされます。 対応する label もまた required クラスをレンダリングします。

これらは表面的でバリデーションからは独立しています。Symfonyに フィールドタイプを推測することを許可する場合は、 このオプションの値はバリデーションの情報から推測されるのが理想的でしょう。

label

データ型: string デフォルト: フィールド名から推測されたものです。

フィールドがレンダリングされる際にラベルが設定されます。false が設定されるとラベルは表示されません。 ラベルはテンプレート内部で設定することもできます。

{{ render_label(form.name, 'Your name') }}

read_only

データ型: Boolean デフォルト: false

このオプションが true の場合、そのフィールドは readonly 属性付きでレンダリングされるため、編集する事が出来ません。

disabled

データ型: boolean デフォルト: false

ユーザにフィールドの値を変更させたくない場合は、 disabled オプションを true にします。どんなサブミットされた値も無視されます。

error_bubbling

データ型: Boolean デフォルト: false フォームに限り compound

true の場合、このフィールドのエラーは親フィールドまたはフォームに渡されます。 たとえば、通常のフィールドを true に設定した場合、フィールドに対するエラーは 特定のフィールドではなくメインのフォームに付加されます。

error_mapping

データ型: array デフォルト: empty

このオプションはバリデーションエラーの対象を編集することができます。

matchingCityAndZipCode という名前のメソッドを持っているとして、それが city および zip code が一致するかの検証をするとします。しかし残念なことに、 “matchingCityAndZipCode” フィールドがフォームに無いため、 Symfony ができるのはフォームの上部にエラーを表示することです。

カスタマイズされたエラーマッピングを使うと、city フィールドの上にエラーを表示するように、より上手にエラーをマップできます。:

public function setDefaultOptions(OptionsResolverInterface $resolver)
{
    $resolver->setDefaults(array(
        'error_mapping' => array(
            'matchingCityAndZipCode' => 'city',
        ),
    ));
}

こちらが左側、右側のマッピングするルールです:

  • 左側はプロパティパスを有します。
  • クラスのプロパティまたはメソッドで違反が生成された場合、そのパスは単に “propertyName” です。
  • array または ArrayAccess オブジェクトで違反が生成された場合、プロパティパスは [indexName] です。
  • ドットでプロパティを分離し、それらを連結して、ネストされたプロパティパスを作成することができます。たとえば addresses[work].matchingCityAndZipCode のように。
  • 左側のエラーマッピングは単一のドット . も認められます。それはフィールド自体をさしています。フィールドに追加されたエラーはネストされたフィールドの代わりに付与されたことを意味します。
  • 右側は単にフォームのフィールド名を有します。

mapped

データ型: boolean

オブジェクトを読み込んでいるまたは書き込んでいる間、フィールドが無視されるようにしたい場合は、 mapped オプションを false にしてください。

inherit_data

New in version 2.3: このオプションは Symfony 2.3 より前は virtual として知られていました。

データ型: boolean デフォルト: false

フォームが親フォームからデータを継承する場合は、このオプションで決定します。複数のフォーム間で重複しているフィールドのセットを持っている場合に役立ちます。参照 “inherit_data”オプションを使用してコードの重複を減らす

by_reference

データ型type: Boolean デフォルト: true

下層にあるオブジェクトに name フィールドを持つとして、ほとんどの場合、setName が呼ばれることを期待します。 しかし、場合によっては setName が呼ばれ ない ことがあります。by_reference をセットすることですべての場合にセッターが呼ばれることを確実にします。

さらに説明するため、簡単な例がこちらです。:

$builder = $this->createFormBuilder($article);
$builder
    ->add('title', 'text')
    ->add(
        $builder->create('author', 'form', array('by_reference' => ?))
            ->add('name', 'text')
            ->add('email', 'email')
    )

by_referencetrue の場合、フォームの submit (または handleRequest )が呼ばれたとき、次のように裏側では処理されます。:

$article->setTitle('...');
$article->getAuthor()->setName('...');
$article->getAuthor()->setEmail('...');

setAuthor が呼び出されないことに注意して下さい。その author はリファレンスにより変更されます。

by_referencefalse の場合、送信時の処理はこのようになります。:

$article->setTitle('...');
$author = $article->getAuthor();
$author->setName('...');
$author->setEmail('...');
$article->setAuthor($author);

このように by_reference=false が実際にすることは、親オブジェクトでセッターを呼ぶことをフレームワークに強制することです。

同様に、下層にあるコレクションに collection フォームタイプを利用している場合、データは( Doctrine の ArrayCollection のように)オブジェクトです。そして、(例えば setAuthors のように)セッターが呼ばれる必要があるときは、by_referencefalse に設定されるべきです。

empty_data

データ型: mixed デフォルト: multiple 又は expanded の場合 array() それ以外 ''

このオプションは empty_value の選択肢が選ばれた時に、どのような値を返すかを決定します。

このオプションのデフォルト値はフィールドオプションによって異なります。:

  • data_class が設定され requiredtrue の場合、 new $data_class();
  • data_class が設定され requiredfalse の場合、 null;
  • data_class が設定されず compoundtrue の場合、 array();
  • data_class が設定されず compoundfalse の場合、 null.

しかし、必要に応じてこれを変更することができます。例えば、値が選択されていないとき gender フィールドを明示的に null に設定したいとすると、このようにできます。:

$builder->add('gender', 'choice', array(
    'choices' => array(
        'm' => 'Male',
        'f' => 'Female'
    ),
    'required'    => false,
    'empty_value' => 'Choose your gender',
    'empty_data'  => null
));

Note

フォームクラス全体に empty_data オプションをセットしたい場合はクックブックの記事( /cookbook/form/use_empty_data )を参照してください。

blog comments powered by Disqus