我有一个ChoiceType::class输入字段在我的表单,现在只是作为一个例子,两个选择:"选择"=比;['类型1 ' =比;'1', 'type2' =>' 2 ']
现在当用户选择type2我想添加一个额外的TextType::类输入字段的形式。但是我不想显示输入字段之前,我希望它是必需的,如果选择type2,而不是如果选择type1。
我希望它是有意义的,我尝试它与javascript和设置属性为隐藏或不,但是然后,由于必需的属性,表单没有被发送。
我尝试了表单事件,但没有让它以这种方式工作。
感谢你的方法是对的,你必须用Javascript来做。你只需要管理Javascript中所需的attr,这样表单就不会用这样的东西阻止你:
- 从字段中删除所需属性:
document.getElementById("id").required = false;
- 设置必填项:
document.getElementById("id").required = true;
您可以检查表单是否可以提交:document.getElementById("idForm").reportValidity();
。
使用带有数据属性的条件字段的实现,例如:
->add('typeField', EnumType::class, [
'label' => 'Type',
'class' => MyTypeEnum::Class,
])
->add('someField', TextField::class, [
'data-controller' => 'depends-on',
'data-depends-on' => 'my_form_typeField',
'data-depends-value' => MyTypeEnum::OTHER->value,
])
在前端JS刺激控制器显示/隐藏someField依赖于typeField值。object (formType中的'data_class')中的validation()函数进行自定义验证,例如:
/**
* @AssertCallback
*/
public function validate(ExecutionContextInterface $context)
{
if ($this->typeField !== MyTypeEnum::OTHER) {
$context->buildViolation('message')->atPath('typeField')->addViolation();
}
}