【发布时间】:2015-01-04 10:35:40
【问题描述】:
我想创建一个依赖选择框:如果第一个选择框被选中,第二个选择框应该被填充。
我的第一个选择框没有映射到模型。我使用$form->get('emailTemplateBlockType')->setData($emailTemplateBlockType) 在我的控制器中手动设置值。如何在我的表单事件中使用这些数据来创建我的第二个选择框?
$builder
->add('emailTemplateBlockType', 'entity', array(
'class' => 'MbDbMVibesBundle:EmailTemplateBlockType',
'property' => 'name',
'mapped' => false,
'empty_value' => 'Choose a block type',
'attr' => array(
'class' => 'emailTemplateBlockTypeSelect',
)
))
->add('save', 'submit');
$builder->addEventListener(FormEvents::POST_SET_DATA, function (FormEvent $event) {
$form = $event->getForm();
$data = $event->getData();
echo "name: ".$form->get('emailTemplateBlockType')->getData()->getName();
die;
});
我有一个 jQuery 的 onChange 事件,它将第一个选择框的选择再次发布到我的前端控制器。然后前端控制器再次创建表单,但这次添加了第一个选择框的值。但由于它不是提交,我认为使用 POST_SUBMIT 事件也不起作用。
来自我的控制器的片段:
$form = $this->createForm(new EmailTemplateSiteEmailTemplateBlockType(), $entity, array(
'action' => $this->generateUrl('_email_tpl_site_block_edit', array(
'emailTemplateSiteId' => $emailTemplateSiteId,
'emailTemplateSiteBlockId' => $emailTemplateSiteBlockId,
))
));
if ($request->request->get('blockTypeId')) {
$this->get('logger')->debug('setting block type');
$emailTemplateBlockType = $em->getRepository('MbDbMVibesBundle:EmailTemplateBlockType')
->find($request->request->get('blockTypeId'));
if ($emailTemplateBlockType)
$form->get('emailTemplateBlockType')->setData($emailTemplateBlockType);
else
throw new $this->createNotFoundException('Cannot find blocktype with id '.$request->request->get('blockTypeId'));
}
$form->handleRequest($request);
【问题讨论】:
-
您是否尝试过将该事件绑定到
POST_SUBMIT? -
是的,我刚试过.. 不起作用,因为我没有提交重新加载表单。也许我应该编辑我的问题。
-
@rolandow:使用 PRE_SUBMIT 事件,你会得到原始数据。
标签: symfony symfony-forms