gpt4 book ai didi

symfony - 如何创建两个相关的单选按钮?

转载 作者:行者123 更新时间:2023-12-04 17:08:15 25 4
gpt4 key购买 nike

下面的代码创建了 2 个单选按钮,但是它们彼此不相关。一个以名称 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
));
}

最佳答案

使用 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));
请注意,目前,由于您将“ friend ”和“向导”数据映射到 RadioType他们应该持有一个 bool 值:
$myCustomFormData = array(
'friend' => true, // checked
'guide' => false, // unchecked
);
但是你会如何取消选择一个值呢?
你应该有一个占位符来做到这一点,并在提交时处理它......
此外,可以使用 finishView 更改名称。类型类的方法,它采用 FormView (您的类型的内置 View ),表单本身和作为参数的选项:
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开箱即用。
我假设您的自定义表单类型是关于选择“ friend ”或“指南”,所以它可能看起来像这样:
$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',
));
渲染时,“ friend ”选项将被选中,您可以将其更改为“指导”。 choices 的一系列选项options 将标签作为键,将选择值作为值:
<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>

...

关于symfony - 如何创建两个相关的单选按钮?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35780841/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com