【问题标题】:How to use custom values in Symfony 2.7 choice form field instead of numbers如何在 Symfony 2.7 选择表单字段中使用自定义值而不是数字
【发布时间】: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 =&gt; value 被呈现为 &lt;option value="key"&gt;value&lt;/option&gt;。要在 Symfony 2.7 中关闭此行为,必须使用 'choices_as_values' =&gt; true 选项。

但我不明白,为什么不简单地使用 choices(这是一个 key =&gt; value 数组)中指定的值...

提供如此奇怪结果的choice_value 回调有什么问题?

【问题讨论】:

    标签: forms symfony


    【解决方案1】:

    所以选项得到的值是 0-2 而不是 option_value_N。我该如何更改?

    从2.7版本开始产生“choices”选项的方式发生了变化,如果choice_value选项为null,则使用递增的整数作为值。

    提供如此奇怪结果的choice_value 回调有什么问题?

    如果您需要保留最终 &lt;select&gt; 中的值,则只需这样做:

    ->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:建议:避免使用名称作为“选项”作为变量或键名...

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-01-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-09-13
        相关资源
        最近更新 更多