Forms 如何从symfony2中的其他实体加载和保存复选框的表单字段数据
项目:Symfony 2.4,FOSUserBundle,SonataUserBundle 任务 我有它的用户实体和配置文件表单。我想为提醒订阅添加复选框。通过单向关系设置->用户,将其保存在不同的实体“设置”中。如果用户的“设置”中有行,则应选中复选框;如果行不存在,则应取消选中该行。因此,我需要: 渲染复选框 加载数据 保存数据 实施 1.渲染复选框 我知道这取决于字段类型,因为我想我可以使用实体类型,但现在我有了以下代码:Forms 如何从symfony2中的其他实体加载和保存复选框的表单字段数据,forms,symfony,symfony-2.4,fieldtype,Forms,Symfony,Symfony 2.4,Fieldtype,项目:Symfony 2.4,FOSUserBundle,SonataUserBundle 任务 我有它的用户实体和配置文件表单。我想为提醒订阅添加复选框。通过单向关系设置->用户,将其保存在不同的实体“设置”中。如果用户的“设置”中有行,则应选中复选框;如果行不存在,则应取消选中该行。因此,我需要: 渲染复选框 加载数据 保存数据 实施 1.渲染复选框 我知道这取决于字段类型,因为我想我可以使用实体类型,但现在我有了以下代码: class ProfileFormType extends Pro
class ProfileFormType extends ProfileType
{
$builder
->add("subscribeReminder", "checkbox",
array(
"mapped" => false,
'required' => false,
)
);
}
2.加载数据
我认为可以在字段选项中使用“class”和“query_builder”来完成,但我没有成功。当设置存在时,需要将复选框设置为true
3.保存数据
我想我可以将数据保存在FormHandler->onSuccess中,并将存储库传递给构造函数。需要删除行或创建行
沿路
我完全沉浸在文档中。可以实现EventListeners、EventSubscribers。尝试了不同的方法却没有成功。我希望有更简单的方法。如果您可以在用户类中创建一个属性或方法,如果用户订阅了该属性或方法,则该属性或方法将返回true,那么您可以在buildForm方法的末尾添加如下内容:
$user = $builder->getData();
if($user instanceof User && $user->isSubscribed())
{
$builder->remove('subscribeReminder');
}
如果无法创建这样的方法或属性,请使用选项数组。在控制器中获取布尔值(例如,如果用户已订阅),并将该值作为选项传递给表单,如下所示:
$form = $formFactory->create($formType, $entity, array('isSubscribed' => true));
为了简单起见,我通过了true,但您应该通过正确的布尔值
然后在表单类型中,添加以下方法:
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setDefaults(array(
'isSubscribed' => false
));
}
为了获得额外的安全性,您还可以使用$resolver->setAllowedTypes验证传递的选项
在构建表单的末尾添加以下内容:
if($options['isSubscribed'])
{
$builder->remove('subscribeReminder');
}
对不起,有错了,祝你好运!:
问题的最后一部分,你可以添加表单事件,但我认为在这种情况下最好保持简单
您可以在buildForm中向窗体添加事件侦听器,如下所示:
$builder->addEventListener(FormEvents::SUBMIT, function(FormEvent $event) use ($something)
{
...
}