首页 文章

如何在Symfony 2.7选择表单字段中使用自定义值而不是数字

提问于
浏览
1

我正在努力在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 回答

  • 1

    因此选项获取值0-2而不是option_value_N . 我怎么能改变这个?

    自版本2.7起,生成"choices"选项的方法已更改,如果 choice_value 选项为 null ,则使用递增整数作为值 .

    并且带有如此奇怪结果的choice_value回调有什么问题?

    如果您需要将值保留在最终 <select> 中,那么只需要这样做:

    ->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,
        // this will keep the same functionality as before
        'choice_value' => function ($value, $key, $index) {
            return $value;
        }
    ));
    
    THE RESULT:
    <select id="custom_data_type_option" class="form-control" name="custom_data_type[option]">
        <option value="option_value_1">Option C</option>
        <option value="option_value_2">Option C</option>
        <option value="option_value_3">Option C</option>
    </select>
    

    参考文献:

  • 2

    这就是我的方式,它运作良好(但Symfony 2.8) . 我没有反转键定义我的数组并使用php array_flip() 方法:

    use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
    
    $myArray = [
        'option_value_1' => 'Option A',
        'option_value_2' => 'Option B',
        'option_value_3' => 'Option C',
    ];
    
    $builder->add('mySelect', ChoiceType::class, [
        'choices' => array_flip($myArray),
        'choices_as_values' => true,
    ]);
    

    使用Twig渲染:

    {{ form_widget(form.mySelect) }}
    

    PS:建议:避免使用名称作为变量或关键名称的“选项”......

相关问题