如何从symfony2中的其他实体加载和保存表单字段数据

时间:2014-05-07 10:59:14

标签: forms symfony symfony-2.4 fieldtype

项目:Symfony 2.4,FOSUserBundle,SonataUserBundle。

任务

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

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

    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。尝试了不同的方法,没有运气。我认为(希望)有一些更简单的东西。

1 个答案:

答案 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)
{
    ...
}