我在表单中有一个ChoiceType::class输入字段,现在作为一个例子,有两个选项:‘=> 'type1’=> '1','type2‘=> '2’
现在,当用户选择type2时,我希望向表单中添加一个exta::class输入字段。但是我不想在此之前显示输入字段,如果选择了type2,而不是选择了type1,我希望输入字段是必需的。
我希望这是有意义的,我尝试使用javascript并将属性设置为隐藏或不隐藏,但是由于所需的属性,表单没有发送。
我尝试了表单事件,但没有让它以那样的方式工作。
谢谢
发布于 2022-07-04 12:05:20
你在正确的道路上,你必须在Javascript中这样做。您只需要管理Javascript中所需的attr,这样表单就不会像这样阻止您:
从字段中移除所需的属性:document.getElementById("id").required = false;
document.getElementById("id").required = true;您可以检查表单是否可以与:document.getElementById("idForm").reportValidity();相加。
发布于 2022-07-06 13:53:59
I使用具有数据属性的条件字段的实现,例如:
->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中的object()函数(formType中的‘formType’)进行自定义验证,例如:
/**
* @Assert\Callback
*/
public function validate(ExecutionContextInterface $context)
{
if ($this->typeField !== MyTypeEnum::OTHER) {
$context->buildViolation('message')->atPath('typeField')->addViolation();
}
}https://stackoverflow.com/questions/72856334
复制相似问题