在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'在选择菜单中显示为占位符但在选项列表中不显示(或不可选)?
答案 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。