我正在尝试在Symfony2中实现动态表单。表单很简单,首先用户选择代理,然后根据该代理选择一个帐户。因此,在选择代理之前,帐户将被禁用。
如果是文本输入,read_only => true
可能是一个解决方案,但select只有readonly属性。所以,我禁用了select,然后尝试使用jQuery启用select:
$('#form select').prop('disabled', false);
问题是在服务器端,Symfony无法处理禁用的表单字段。它的值只是设置为null。
我想到了可能的解决方案。首先,我可以在控制器中手动设置字段值,因为我测试了表单字段值实际上在请求参数中,Symfony只是忽略处理它并将其映射到对象。我认为它会起作用,但这不是一个很好的解决方案。
其次,我可以通过一些客户端黑客禁用选择,或者向表单添加隐藏输入并使用Javascript手动设置它的值。
这里有标准解决方案吗?
我的表单实体如下所示:
$builder->add('broker', 'entity', array(
'class' => 'MyBundle:Broker',
'property' => 'name',
'query_builder' => function(BrokerRepository $br) {
return $br->getActiveBrokersQuery();
},
'required' => true,
'empty_value' => 'Choose a broker',
));
$builder->add('accountType', 'entity', array(
'class' => 'MyBundle:AccountType',
'empty_value' => 'Choose a broker first',
'disabled' => true,
));
如果我没有禁用选择,一切正常,Symfony可以完美地处理请求。
答案 0 :(得分:6)
我根据hakre的建议设法解决了这个问题。所以我需要告诉表单该字段不再被禁用。因此,我在表单中添加了一个PRE_SUBMIT事件,我在accountType字段中将disabled值设置为false。
$builder->addEventListener(
FormEvents::PRE_SUBMIT,
function(FormEvent $event) {
$event->getForm()->add('accountType', 'entity', array(
'class' => 'XXBundle:AccountType',
'empty_value' => 'Choose a broker first',
'disabled' => false
));
}
);
感谢您的建议!