名前と色でアクティビティを追加する簡単なフォームを作成しようとしています。
だから私はいくつかの色の配列でリストを作りたいのですが、今のところ、私は色の名前を持っています。
selectタグに任意の属性を追加できます:
$form = $this->createFormBuilder($myclass)
->add('Colors','choice',array('label'=>'select some colors',
'multiple'=>true,
'choices'=>array(1=>'red', 2=>'blue', 3=>'green'),
'attr'=>array('style'=>'width:300px', 'customattr'=>'customdata')
));
出力は次のようになります。
<select name="select" style="width: 300px;" multiple="multiple" customattr="customdata">
<option value="1">red</option>
<option value="2">blue</option>
<option value="3">green</option>
</select>
しかし、どうすればselected="selected"
と選択オプションに追加したい属性はありますか?このような:
<select name="select" style="width: 300px;" multiple="multiple" customattr="customdata">
<option style="background-color: #F00;" value="1" selected="selected">red</option>
<option style="background-color: #00F;" value="2" selected="selected">blue</option>
<option style="background-color: #0F0;" value="3">green</option>
</select>
私の質問は、symfony FormBuilderでoption
タグ(select
タグではない)にカスタム属性を追加するにはどうすればよいですか?.
注意: JavaScriptを使用したくありません。 symfony2 FormBuilderを使用して選択オプションをカスタマイズしたいと思います。
通常、フィールドのデフォルトデータは、オブジェクトに格納されている値によって決まります。たとえば、
class MyClass
{
private $Colors = array(1, 2);
}
次に、「1」と「2」のエントリ(「red」と「green」のラベルが付いたもの)がデフォルトで選択された状態で表示されます。この値をオブジェクトに格納してから、フォームに渡すこともできます。
$myObject->Colors = array(1, 2);
$form = $this->createFormBuilder($myObject)
...
最後の可能性は、 "data"オプションを渡して、オブジェクトに保存されているデフォルト値を上書きすることです:
$builder->add('Colors', 'choice', array(
'label' => 'select some colors',
'multiple' => true,
'choices' => array(1 => 'red', 2 => 'blue', 3 => 'green'),
'attr' => array('style' => 'width:300px', 'customattr' => 'customdata'),
'data' => array(1, 2),
));
ここで選択されているようにデータオプションを使用しますfo selected = "selected": http://symfony.com/doc/current/reference/forms/types/field.html
あなたの場合、このようになる可能性があります
$form = $this->createFormBuilder($myclass)
->add('Colors','choice',array('label'=>'select some colors',
'multiple'=>true,
'choices'=>array(1=>'red', 2=>'blue', 3=>'green'),
'attr'=>array('style'=>'width:300px', 'customattr'=>'customdata'),
'data'=> 1
));
新しい要素はdataで、選択した配列の数を選択された属性として設定します
選択肢の値に基づいて、選択肢にカスタム属性を追加するには、 ChoiceType フィールドのchoice_attr
オプションの使用を検討してください。
たとえば、jsonでエンコードされたエンティティをオプションに渡したい場合は、次のように使用できます。
'choice_attr' => function($val, $key) {
return ['data-object' => json_encode($val)];
},
フォームクラスメソッドSymfony\Component\Form\AbstractType :: finishViewに追加します
public function finishView(FormView $view, FormInterface $form, array $options)
{
parent::finishView($view, $form, $options);
$additionalAttributes = array();
// myMethod - method $choice, returns a value that is to be substituted into the attribute
foreach ($view->children['orders']->vars['choices'] as $id => $choice) {
$additionalAttributes[$id] = array(
'data-cost' => $this->propertyAccessor->getValue($choice->data, 'myMethod'),
'disabled' => 'disabled',
);
}
foreach ($view->children['orders']->children as $id => $child) {
$child->vars['attr'] = array_replace(
isset($child->vars['attr']) ? $child->vars['attr'] : array(),
$additionalAttributes[$id]
);
}
}
SymfonyのすべてのField
は、デフォルトのオプションを渡すことができるdata
オプションを持つ 抽象フィールドタイプ から継承します。
ちなみに、style
を渡さないでください。カスタム属性の場合は data-*
属性。
Symfony 2.7はこれを簡単にするためのサポートを追加するようです: