Symfony 3 - 表单选择:如何设置'禁用' ="占位符"

时间:2016-05-06 09:30:24

标签: symfony-forms symfony

在Symfony 3中,我想要'占位符'在进行任何选择之前显示的选择列表菜单,但在用户的可用选项列表中不显示(或不可选)。

MyEntityType的函数buildForm(),扩展AbstractType如下所示:

public function buildForm(FormBuilderInterface $builder, array $options)
  {

    $list = array([array with choices values and descriptions]);
    $builder
    ->add('description',TextType::class, array('label'=>'trans.my_desc'))
  ->add('list',ChoiceType::class,array(
    'label'=>'trans.my_list',
    'multiple'=>false,
    'choices'=>$list,
    'placeholder'=>'trans.do_a_choice',
    //'placeholder_in_choices'=>false //this option is not available
)
->add('submit',SubmitType::class,array('label'=>'trans.validate'));

  }

当我查看文档时,我看到有一个布尔选项placeholder_in_choices(http://symfony.com/doc/current/reference/forms/types/choice.html#field-variables)但是这个选项不能在[列表选项数组]中设置,该选项位于" - > ;添加(' list',ChoiceType :: class,array([列表选项数组])"(它会引发错误,说明&placeff_in_choices'不可用选项)。

通过我的搜索,我发现这个已存在的问题接近我的问题:Symfony how to disable the default option

通过阅读后,我试图在MyEntityType类中实现finishView()函数:

 public function finishView(FormView $view, FormInterface $form, array $options){

    var_dump($view->children['list']->vars);

   foreach ($view->children['list']->vars['choices'] as $sma) {
        if ($sma->value == "") {
            $sma->attr['disabled'] = 'disabled';
        }
   }
}

问题是,正如var_dump()中显示的那样,$ view-> children [' list'] - > vars [' choices']不会包括'占位符'价值或标签(trans.do_a_choice),因此无法附加“禁用”标签。属于它。

有没有人知道如何让trans.do_a_choice'在选择菜单中显示为占位符但在选项列表中不显示(或不可选)?

1 个答案:

答案 0 :(得分:0)

如果我正确理解,您希望占位符存在但不被接受为选定值?

要执行此操作,只需添加选择约束,您将具有所需的行为。如果用户选择空值或占位符值,则表单将无法通过验证。

类似这样的东西:

   use Symfony\Component\Validator\Constraints as Assert;

   public function buildForm(FormBuilderInterface $builder, array $options)
      {

        $list = array([array with choices values and descriptions]);
        $builder
        ->add('description',TextType::class, array('label'=>'trans.my_desc'))
      ->add('list',ChoiceType::class,array(
        'label'=>'trans.my_list',
        'multiple'=>false,
        'choices'=>$list,
        'placeholder'=>'trans.do_a_choice',
        'constraints' => array(
                            new Assert\Choice($valuesFromTheListOfChoices)
                        ),
    )
    ->add('submit',SubmitType::class,array('label'=>'trans.validate'));

      }

非常重要的是,在assert / Choice中传递的值与选择列表中的值匹配。这意味着,如果您选择占位符值,则必须得到一个验证错误。

对于“ placeholder_in_choices”,该选项是根据“ placeholder”,“ choices”或“ preferred_choices”解析的。

https://github.com/symfony/form/blob/3.1/Extension/Core/Type/ChoiceType.php#L204

如果您的选择列表中有一个空值的项目,它将设置为true。