【发布时间】:2023-03-31 06:09:01
【问题描述】:
我正在努力在 Symfony 2.7 中使用 choice 表单字段。目标是让用户选择一些非常基本的选项:
数据对象
class MyDataObj {
protected $option = null;
public function getOption() {
return $this->option;
}
public function setOption($option) {
$this->option = $option;
}
}
在某些控制器中创建表单:
...
$dataObject = new MyDataObject();
$form = $this->createForm('custom_data_type', $dataObject);
$form->handleRequest($request);
if ($form->isValid()) {
...
}
自定义 FormType
public function buildForm(FormBuilderInterface $builder, array $options) {
$builder
->add('option', 'choice', array(
...
'choices' => array(
'Option A' => 'option_value_1',
'Option B' => 'option_value_2',
'Option C' => 'option_value_3',
),
'choices_as_values' => true,
));
...
}
渲染结果:
<select id="custom_data_type_option" class="form-control" name="custom_data_type[option]">
<option value="0">Option A</option>
<option value="1">Option B</option>
<option value="2">Option C</option>
</select>
所以选项得到的值是 0-2 而不是 option_value_N。我该如何更改?
我已经尝试添加choice_value 回调。然而,结果更令人恼火:
->add('option', 'choice', array(
...
'choices' => array(
'Option A' => 'option_value_1',
'Option B' => 'option_value_2',
'Option C' => 'option_value_3',
),
'choices_as_values' => true,
'choice_value' => function ($allChoices, $currentChoiceKey) {
if (null === $currentChoiceKey)
return 'nothing';
if ('Option A' === $currentChoiceKey)
return 'option_value_1';
if ('Option B' === $currentChoiceKey)
return 'option_value_2';
if ('Option C' === $currentChoiceKey)
return 'option_value_3';
return 'unknown';
}
));
THE RESULT:
<select id="custom_data_type_option" class="form-control" name="custom_data_type[option]">
<option value="nothing">Option C</option>
<option value="nothing">Option C</option>
<option value="nothing">Option C</option>
</select>
我明白,在 Symfony 2.7 之前,处理方式有所不同,选择 key => value 被呈现为 <option value="key">value</option>。要在 Symfony 2.7 中关闭此行为,必须使用 'choices_as_values' => true 选项。
但我不明白,为什么不简单地使用 choices(这是一个 key => value 数组)中指定的值...
提供如此奇怪结果的choice_value 回调有什么问题?
【问题讨论】: