我正在努力在Symfony 2.7中使用 choice
表单字段 . 目标是让用户选择一些非常基本的选项:
Data Object
class MyDataObj {
protected $option = null;
public function getOption() {
return $this->option;
}
public function setOption($option) {
$this->option = $option;
}
}
Form creation within some controller :
...
$dataObject = new MyDataObject();
$form = $this->createForm('custom_data_type', $dataObject);
$form->handleRequest($request);
if ($form->isValid()) {
...
}
The custom 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
回调出现了如此奇怪的结果有什么问题?
2 回答
自版本2.7起,生成"choices"选项的方法已更改,如果
choice_value
选项为null
,则使用递增整数作为值 .如果您需要将值保留在最终
<select>
中,那么只需要这样做:参考文献:
http://symfony.com/doc/2.7/reference/forms/types/choice.html#choice-value
https://github.com/symfony/symfony/pull/14825/files
这就是我的方式,它运作良好(但Symfony 2.8) . 我没有反转键定义我的数组并使用php
array_flip()
方法:使用Twig渲染:
PS:建议:避免使用名称作为变量或关键名称的“选项”......