下面的代码会创建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
));
}
答案 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
// ...
然后您的数据将如下所示:
$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)
答案 3 :(得分:0)
ForeignKey
由RadioType
内部使用。在大多数情况下,您都想使用ChoiceType
。