如何创建两个相关的radiobuttons?

时间:2016-03-03 19:06:17

标签: symfony

下面的代码会创建2个radiobuttons,但它们彼此无关。一个名称为description_form[friend],另一个名称为description_form[guide]。如何使用相同的名称呈现它们? documentation对此主题并不清楚。

public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('friend', RadioType::class, array(
                'label'    => 'Friend',
                'required' => false
            ))
            ->add('guide', RadioType::class, array(
                'label'    => 'Guide',
                'required' => false
            ));
    }

4 个答案:

答案 0 :(得分:7)

使用RadioType列表并不容易,这就是为什么每个人都建议您使用ChoiceType根据选择数据数组动态创建广播列表的原因。

创建FormTypeInterface时,它必须(通常)表示全局表单中的一个字段或一个子表单,因此每个字段名称必须唯一才能映射到相应的数据。

buildForm方法允许在您FormType中添加一些子字段,在您的情况下,该字段包含两个子字段作为单选按钮,每个子字段都有一个特定的名称,这是默认情况下的,但是你应该始终牢记你想要处理的全局数组数据。

以下是您的例子:

class MyCustomFormType extends \Symfony\Component\Form\AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('friend', RadioType::class, array(
                'label'    => 'Friend',
                'required' => false
            ))
            ->add('guide', RadioType::class, array(
                'label'    => 'Guide',
                'required' => false
            ));
    }

    public function getBlockPrefix
    {
        return 'my_custom';
    }

    // ...
}

因此,此表单类型数据应如下所示:

$myCustomFormData = array(
    'friend' => $friendData,
    'guide' => $guideData,
);

并以全局形式嵌套:

$formData = array(
    'my_custom' => $myCustomFormData,
);

但您可以根据需要命名字段:

// In a controller extending \Symfony\Bundle\FrameworkBundle\Controller\Controller
$form = $this->createFormBuilder()
    ->add('custom_field', MyCustomFormType::class)
    ->getForm();

// Then
$form->setData(array('custom_field' => $myCustomFormData));

请注意,目前,因为您映射了"朋友"和"指南"数据到RadioType它们应该保持一个布尔值:

$myCustomFormData = array(
    'friend' => true, // checked
    'guide' => false, // unchecked
);

但是你怎么会取消选择一个值呢?

你应该有一个占位符来做这件事,并在提交时处理它......

此外,可以使用类型类的finishView方法更改名称,它采用FormView(类型的构建视图),表单本身和选项作为参数:< / p>

public function finishView(FormView $view, FormInterface $form, array $options)
{
    $childName = $view->vars['full_name']; // "my_custom" by default

    foreach ($view as $childView) {
        $childView->vars['full_name'] = $childName;
    }
}

但您还需要添加DataMapperInterface以将提交的值恢复为表单类型本身。

要做到这一切,您需要知道表单组件的工作方式,并不容易。

简单方法

所以我同意其他答案,你应该使用ChoiceType来开箱即用。

我认为您的自定义表单类型是关于选择&#34;朋友&#34;或者指导&#34;,所以看起来像这样:

$builder
    ->add('fellow', ChoiceType::class, array(
        'choices' => array(
            'I have a friend' => 'friend',
            'I\'d like a guide' => 'guide',
        ),
        'expanded' => true, // use a radio list instead of a select input
        // ...

查看the official docs

然后您的数据将如下所示:

$form->add('custom_field', MyCustomFormType::class);

$form->setData(array(
    'custom_field' => 'friend',
));

当呈现&#34;朋友&#34;选择将被选中,您将能够将其更改为&#34;指南&#34;。

choices选项的一系列选项将标签作为键和选择值作为值:

<div id="form_custom_field">
    <input type="radio" name="form[custom_field]" value="friend" checked="checked">
    <label>I have a friend</label> 
    <input type="radio" name="form[custom_field]" value="guide">
    <label>I'd like a guide</label>

... 

答案 1 :(得分:2)

这就是我在Symfony 2.7中做单选按钮的方法,希望它可以帮到你。

   $yes_no = array('1'=>'Yes','0'=>'No');

   ->add('myfieldname', 'choice',array(
        'choices' => $yes_no,
        'label'=>'YourLabelGoeshere',
        'required'=>true,
        'expanded'=>true,
        'multiple'=>false,
        'placeholder'=>false
))

答案 2 :(得分:1)

也许考虑使用ChoiceType字段。

见这里:Documentation

如果您愿意,可以将选项输出为单选按钮。

答案 3 :(得分:0)

ForeignKeyRadioType内部使用。在大多数情况下,您都想使用ChoiceType