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