Symfony2禁用选择

时间:2013-12-31 11:58:22

标签: php jquery forms symfony

我正在尝试在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可以完美地处理请求。

1 个答案:

答案 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
                ));
            }
        );

感谢您的建议!