Php Symfony2禁用选择

Php Symfony2禁用选择,php,jquery,forms,symfony,Php,Jquery,Forms,Symfony,我正在尝试在Symfony2中实现动态表单。表单很简单,首先用户选择一个代理,然后根据该代理选择一个帐户。因此,在选择代理之前,帐户将被禁用 对于文本输入,read_only=>true可以是一个解决方案,但select没有readonly属性。因此,我禁用了select,然后尝试使用jQuery启用select: $('#form select').prop('disabled', false); 问题是,在服务器端,Symfony无法处理禁用的表单字段。它的值被简单地设置为null 我想到

我正在尝试在Symfony2中实现动态表单。表单很简单,首先用户选择一个代理,然后根据该代理选择一个帐户。因此,在选择代理之前,帐户将被禁用

对于文本输入,read_only=>true可以是一个解决方案,但select没有readonly属性。因此,我禁用了select,然后尝试使用jQuery启用select:

$('#form select').prop('disabled', false);
问题是,在服务器端,Symfony无法处理禁用的表单字段。它的值被简单地设置为null

我想到了可能的解决办法。首先,我可以在控制器中手动设置字段值,因为我测试了表单字段值实际上在请求参数中,Symfony只是忽略处理它并将其映射到对象。我认为它会起作用,但这不是一个很好的解决方案

其次,我可以通过一些客户端黑客来禁用select,或者向表单添加一个隐藏的输入,并使用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,
));

如果我不禁用select,一切正常,Symfony会完美地处理请求。

根据hakre的建议,我成功地解决了问题。所以我需要告诉表单该字段不再被禁用。因此,我在表单中添加了一个PRE_SUBMIT事件,在该事件中,我在accountType字段中将禁用的值设置为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
                ));
            }
        );

谢谢你的建议

启动step调试器,看看为什么Symfony不处理该元素,并且它的值为NULL。它是真的为空还是因为浏览器不发送元素而没有设置?由于代码是开放的,您应该从中获益。最佳实践可以在中找到。如果我调用$accountAddForm->HandlerRequest$request;,我用$accountAddForm->getData:objectstdClass653 6{[\uuuu CLASS\uuuu]=>string42 CashbackCloud\FcbcBundle\Entity\AccountAdd[broker]=>objectstdClass764 19{[\uu CLASS\uuu]=>string38 CashbackCloud\FcbcBundle\Entity\broker[id]=>int8…}[id]=>NULL[user]=>NULL[accountType]=>NULL[accountName]=>string4 3232}但是如果我在提交表单后调用$request->request->all。我得到如下结果:array1{[AccountAdd]=>array5{[broker]=>string18[accountType]=>string2 54[accountName]=>string4 3232[save]=>string0[_-token]=>string40 b3b118149c1dd7a0f861b0c81d147522d5a3d87f},因此该值实际上在请求中,但symfony只是没有将其映射到对象中。我想是因为残废的价值观。我说得对吗?好吧,你又向前迈了一步。现在,您必须通过该请求Symfony告诉您一个条件,即表单元素不再被禁用,因为在您的定义配置中它仍然被禁用。你的昵称全大写,读起来不太友好,只是说说而已。所以我的昵称就是为什么人们从来不回答我的问题我根据你的建议找到了解决办法。我将在不久的将来提交谢谢