1

项目:Symfony 2.4、FOSUserBundle、SonataUserBundle。

任务

我有User它的实体和个人资料表格。我想为提醒订阅添加复选框。这保存在不同的实体“设置”中(单向关系设置 -> 用户)。如果用户复选框的“设置”中有行,则应选中,如果行不存在 - 应取消选中。所以我需要:

  1. 渲染复选框
  2. 加载数据
  3. 保存数据

执行

1. 渲染复选框

我知道这取决于字段类型(因为我认为我可以使用entity类型)但现在我有这个代码:

class ProfileFormType extends ProfileType
{
    $builder
    ->add("subscribeReminder", "checkbox",
        array(
            "mapped" => false,
            'required'  => false,
        )
    );
}

2.加载数据

认为可以在字段选项中使用“class”和“query_builder”来完成,但我没有成功。设置存在时需要将复选框设置为 true。

3. 保存数据

我可以将数据保存在 FormHandler->onSuccess() 中(将存储库传递给构造函数)。需要删除行或创建一个。

在路上

我完全迷失在文档中。可以实现 EventListeners、EventSubscribers。尝试了不同的方法,但没有运气。我认为(希望)有一些更简单的东西。

4

1 回答 1

0

如果您可以在 User 类中创建一个属性或方法,如果订阅了 User 则返回 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() ... 验证传递的选项

并在您的 buildForm() 末尾添加:

if($options['isSubscribed'])
{
    $builder->remove('subscribeReminder');
}

抱歉有任何错别字,祝你好运!:)

你问题的最后一部分,你可以添加表单事件,但我认为最好保持简单的是这种情况。

您可以在 buildForm() 中添加事件侦听器以形成如下形式:

$builder->addEventListener(FormEvents::SUBMIT, function(FormEvent $event) use ($something)
{
    ...
}
于 2014-05-07T11:22:45.790 回答