Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/symfony/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Symfony2表单中的自定义实体数据处理_Symfony_Symfony Forms_Symfony 2.6 - Fatal编程技术网

Symfony2表单中的自定义实体数据处理

Symfony2表单中的自定义实体数据处理,symfony,symfony-forms,symfony-2.6,Symfony,Symfony Forms,Symfony 2.6,我目前正在使用Symfony 2.6在一个站点上实现通知首选项 持有通知首选项的实体如下所示: class UserNotification { //... /** * @ORM\Column(type="boolean") */ private $downtimeNotificationEnabled; /** * @ORM\Column(type="boolean")

我目前正在使用Symfony 2.6在一个站点上实现通知首选项

持有通知首选项的实体如下所示:

class UserNotification
{
    //...
    
    /**
      * @ORM\Column(type="boolean")
      */
    private $downtimeNotificationEnabled;

    /**
      * @ORM\Column(type="boolean")
      */
    private $newPostNotificationEnabled;

    //...
}
目前大约有15种不同的键,但我现在还想允许为每种类型配置电子邮件、SMS和仪表板通知。我没有为每种类型创建两个额外的列,而是考虑将每个启用的
$*列类型从
boolean
更改为doctor
array
,并将数据作为关联数组保存在每个表列中(
['dashboard'=>true,'email'=>false,'sms'=>true]

我的问题是如何将此
数组
列挂接到Symonfy表单类型中。据我所知,我可以为字段创建一个自定义类型,并使用它来代替我当前使用的
'checkbox'
类型。大概是这样的:

class NotificationSettingType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('dashboard', 'checkbox', [
                'mapped'    => false,
                'data'      => true
            ])
            ->add('email', 'checkbox', [
                'mapped'    => false,
                'data'      => true
            ])
            ->add('sms', 'checkbox', [
                'mapped'    => false,
                'data'      => true
            ])
        ;
    }

    //...
}
…和主要形式类型

class NotificationsType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('downtimeNotificationEnabled', new NotificationSettingType())
            ->add('newPostNotificationEnabled', new NotificationSettingType())
            //...
        ;
    }
}
但是,我不明白如何用实体中的
数组
数据填充
NotificationSettingType
中的
复选框
类型的值

编辑1 进一步澄清:

我正在寻找如何将数据绑定到
UserNotification
中的列

比如说:

UserNotification::$downtimeNotificationEnabled = [
    'dashboard' => true, 
    'email'     => false, 
    'sms'       => true
]
然后在此列的
通知设置类型中:

  • 将选中“仪表板”
  • “电子邮件”
    将被取消选中
  • “sms”
    将被选中
  • 然后,在提交后,如果我取消选中SMS,例如,新数组将位于列变量中,如下所示:

    UserNotification::$downtimeNotificationEnabled = [
        'dashboard' => true, 
        'email'     => false, 
        'sms'       => false
    ]
    

    我知道如何传递选项,但不知道如何转换此数据以使其与Symfony2表单类型兼容。

    您要做的是将FormEvents::PRE_SET_data事件添加到NotificationSettingType。这将允许根据UserNotification实体内的数据选中复选框。虽然有一点偏离主题,但是如果你有15个布尔列,那么你真的应该考虑在用户和用户通知之间使用OntOMoNe关系。目前,如果不更改实体,您将无法添加其他通知。谢谢,我会看一看,但为什么这是一条评论而不是答案?此外,要添加其他通知,无论如何都需要更改代码,因为需要实现这些通知。一对多没有我所能看到的好处,而且使代码更加复杂。懒得写一个真正的答案。就关系而言,这只是一个建议。我将从定义通知的配置数组开始。一旦实现,就可以通过调整配置来添加额外的功能。前期可能需要做更多的工作,但可能会节省大量的锅炉板代码。再说一次,只是一个建议。