Symfony3:验证嵌套(可选)表单

阿尔贝托·费奇(Alberto Fecchi)

我的项目中有三个文档:事件,OrganizerProfile和用户。

用户可以具有多个OrganizerProfile(类似于Facebook上的“页面”)和事件。

用户创建和事件时,他可以为事件分配“ OrganizerProfile”(用户Alberto为“公司A”创建一个事件,称为“事件X”)。

为此,我创建了以下表单:

OrganizerProfileType.php

class OrganizerProfileType extends AbstractType{
    public function buildForm(FormBuilderInterface $builder, array $options){
        $builder
            ->add('email', EmailType::class)
            ->add('name', TextType::class)
            ->add('description', TextType::class, ['required' => false])
...

EventType.php

class EventType extends AbstractType {
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $profileChoices = ... //List of existing profiles

        $builder
            ->add('profile_list', ChoiceType::class, [
                'choices' => $profileChoices,
                'required' => false,
                'mapped' => false,
            ])
            ->add('profile', OrganizerProfileType::class, [
                'required' => true,
            ])
            ->add('title', TextType::class, ['required' => false])
            ->add('description', TextType::class, ['required' => false])
...

用户可以在“ profile_list”字段中找到其现有的OrganizerProfiles。如果用户未选择现有的配置文件,则用户可以选择其中之一并将其分配给事件BUT,他必须在“配置文件”表单中插入信息。

我想将个人资料表格设为“可选”,并且仅当用户未选择现有的个人资料时才要求填写该表格。

我怎样才能做到这一点?谢谢

马泰奥

您可以基于提交的数据验证组实施

因此,您的FormType应该如下所示:

class EventType extends AbstractType {

    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $profileChoices = [...];

        $builder
            ->add('profile_list', ChoiceType::class, [
                'choices'  => $profileChoices,
                'required' => false,
                'mapped'   => false,
            ])
            ->add('profile', OrganizerProfileType::class, [
                'constraints' => [
                    new Valid()
                ]
            ])
            ->add('title', TextType::class, ['required' => false])
            ->add('description', TextType::class, ['required' => false]);
    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults([
            'validation_groups' => function (FormInterface $form) {

                if (null === $form->get('profile_list')->getData()) {
                    return ['without_profile'];
                }

                return ['with_profile'];  // Or simply 'Default'
            },
        ]);
    }

}

更新:也使用另一个FormType中的验证组

然后,您需要使用验证组来处理子表单的验证,例如:

class OrganizerProfileType extends AbstractType{

    public function buildForm(FormBuilderInterface $builder, array $options){
        $builder
            ->add('email', EmailType::class, [
                    'constraints' => [
                        new NotNull(
                            [
                                'groups' => ['without_profile', 'with_profile']
                            ]
                        )
            ]])
            ->add('name', TextType::class, [
                    'constraints' => [
                        new NotNull(
                            [
                                'groups' => ['without_profile', 'with_profile']
                            ]
                        )
            ]])
            ->add('description', TextType::class, ['required' => false])

希望这个帮助

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

symfony3 对模型和管理表单的验证相同

来自分类Dev

Symfony3错误登录表单

来自分类Dev

Symfony3 - 如何验证 HTML 标签

来自分类Dev

Symfony3表单类实体管理器

来自分类Dev

Symfony3:是否可以更改表单名称?

来自分类Dev

Symfony3在表单生成期间无法加载类型错误

来自分类Dev

保存表单后出现错误[Symfony3]

来自分类Dev

在 Symfony3 中自定义选择表单类型

来自分类Dev

Symfony3 表单类型和多对多关系

来自分类Dev

Symfony3仅在添加对象时验证字段

来自分类Dev

Ajax与Symfony3

来自分类Dev

如何从子表单中获取父Symfony3表单的值?

来自分类Dev

Symfony表单验证基本表单

来自分类Dev

Symfony 2表单验证

来自分类Dev

symfony3:为具有多对一关系的列的实体创建表单

来自分类Dev

Symfony3将类应用于生成的表单的每个div

来自分类Dev

提交symfony3表单时如何在子实体上设置父ID

来自分类Dev

表单构建器中的关联数组字段-Symfony3

来自分类Dev

Symfony3登录表单:如何在security.yml中设置防火墙参数?

来自分类Dev

Symfony3将类应用于生成的表单的每个div

来自分类Dev

Symfony3忽略表单子项的validation.yml

来自分类Dev

当表单具有实体类型时,Symfony3多对多现实

来自分类Dev

Symfony3 中的错误“CSRF 令牌无效。请尝试重新提交表单”

来自分类Dev

Symfony3 表单类型,通过 id 引用其他实体

来自分类Dev

如何为“创建”和“编辑”操作显示表单的特定字段 - Symfony3

来自分类Dev

如何在 symfony3 中从相同的表单访问 2 个表?

来自分类Dev

Symfony3执行phpmetrics

来自分类Dev

Symfony3 Profiler存储

来自分类Dev

配置Symfony3 URL