15

我正在尝试做一个简单的表单来添加一个带有名称和颜色的活动。

所以我想制作一个包含一些颜色数组的列表,现在它正在工作我有颜色的名称。
我可以将任何属性添加到我的选择标签:

$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标签(而不是标签)添加自定义属性。注意:我不想使用 JavaScript。我想使用 symfony2 FormBuilder 来自定义我的选择选项。select

4

6 回答 6

10

通常,字段的默认数据由对象中存储的值决定。例如,如果

class MyClass
{
    private $Colors = array(1, 2);
}

那么条目“1”和“2”(带有标签“red”和“green”)将默认显示为选中状态。您还可以将此值存储在对象中,然后再将其传递给表单:

$myObject->Colors = array(1, 2);

$form = $this->createFormBuilder($myObject)
    ...

最后一种可能性是通过传递“数据”选项来覆盖存储在对象中的默认值:

$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),
));
于 2012-09-01T07:25:52.167 回答
3

使用此处描述的数据选项 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
            ));

新元素是将选择数组的编号设置为选定属性的数据

于 2012-09-02T06:15:19.500 回答
1

symfony 中的每一个都Field继承自abstract field type,它有一个data选项,您可以在其中传递默认选项。

顺便说一句,不要传递style东西,对于自定义 attrs 使用data-*属性。

于 2012-08-31T14:35:53.603 回答
1

看起来 Symfony 2.7 将添加支持以使这更容易:

https://github.com/symfony/symfony/pull/14050

于 2015-04-28T03:25:44.993 回答
1

为了在选项上添加您的自定义属性,基于该选项的值,请考虑使用ChoiceType字段choice_attr的选项。

例如,如果您想将 json 编码的实体传递给选项,您可以使用如下内容:

'choice_attr' => function($val, $key) {
   return ['data-object' => json_encode($val)];
},
于 2016-09-08T07:09:50.463 回答
1

添加表单类方法 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]
        );
    }
}

Symfony2 Form – 在选择字段类型中添加属性标签选项

于 2015-08-10T06:23:05.547 回答