Symfony2 禁用选择
Posted
技术标签:
【中文标题】Symfony2 禁用选择【英文标题】:Symfony2 disabled select 【发布时间】:2014-01-18 08:55:37 【问题描述】:我正在尝试在 Symfony2 中实现动态表单。形式很简单,首先用户选择一个经纪商,然后根据那个经纪商选择一个账户。因此,在选择经纪人之前,该帐户将被禁用。
如果是文本输入,read_only => true
可能是一个解决方案,但 select 没有只读属性。所以,我禁用了选择,然后尝试使用 jQuery 启用选择:
$('#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 完美处理请求。
【问题讨论】:
启动一个步进调试器并查看为什么 Symfony 不处理该元素,它的值为 NULL。它是真的 NULL 还是因为浏览器不发送元素而没有设置?由于代码全部开放,您应该从中受益。 Symfony2 Cookbook 中提供了最佳实践。 如果我打电话给$accountAddForm->handleRequest($request);
,我会得到$accountAddForm->getData()
:object(stdClass)#653 (6) ["__CLASS__"]=> string(42) "CashbackCloud\FcbcBundle\Entity\AccountAdd" ["broker"]=> object(stdClass)#764 (19) ["__CLASS__"]=> string(38) "CashbackCloud\FcbcBundle\Entity\Broker" ["id"]=> int(8) ... ["id"]=> NULL ["user"]=> NULL ["accountType"]=> NULL ["accountName"]=> string(4) "3232"
但是如果我在提交表单后致电$request->request->all()
。我得到以下信息:array(1) ["AccountAdd"]=> array(5) ["broker"]=> string(1) "8" ["accountType"]=> string(2) "54" ["accountName"]=> string(4) "3232" ["save"]=> string(0) "" ["_token"]=> string(40) "b3b118149c1dd7a0f861b0c81d147522d5a3d87f"
所以值实际上在请求中,但 symfony 只是没有将它映射到对象中。我认为是因为 disabled 值。我说的对吗?
好的,你更进一步了。现在您必须通过该请求告诉 Symfony 表单元素不再被禁用的条件,因为在您的定义(配置)中它仍然被禁用。 (而且你的昵称都是大写的,读起来不太友好,就这么说吧。)
所以我的昵称就是为什么人们从不回答我的问题。 :) 我根据您的建议找到了解决方案。我会在不久的将来提交。 :) 谢谢!
【参考方案1】:
根据 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
));
);
感谢您的建议!
【讨论】:
以上是关于Symfony2 禁用选择的主要内容,如果未能解决你的问题,请参考以下文章
Symfony 2 搜索表单呈现一个不需要的搜索字段。我可以禁用此行为吗?