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
Forms 如何从symfony2中的其他实体加载和保存复选框的表单字段数据_Forms_Symfony_Symfony 2.4_Fieldtype - Fatal编程技术网

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

Forms 如何从symfony2中的其他实体加载和保存复选框的表单字段数据,forms,symfony,symfony-2.4,fieldtype,Forms,Symfony,Symfony 2.4,Fieldtype,项目:Symfony 2.4,FOSUserBundle,SonataUserBundle 任务 我有它的用户实体和配置文件表单。我想为提醒订阅添加复选框。通过单向关系设置->用户,将其保存在不同的实体“设置”中。如果用户的“设置”中有行,则应选中复选框;如果行不存在,则应取消选中该行。因此,我需要: 渲染复选框 加载数据 保存数据 实施 1.渲染复选框 我知道这取决于字段类型,因为我想我可以使用实体类型,但现在我有了以下代码: class ProfileFormType extends Pro

项目:Symfony 2.4,FOSUserBundle,SonataUserBundle

任务 我有它的用户实体和配置文件表单。我想为提醒订阅添加复选框。通过单向关系设置->用户,将其保存在不同的实体“设置”中。如果用户的“设置”中有行,则应选中复选框;如果行不存在,则应取消选中该行。因此,我需要:

渲染复选框 加载数据 保存数据 实施 1.渲染复选框 我知道这取决于字段类型,因为我想我可以使用实体类型,但现在我有了以下代码:

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