Symfony2:如何对自定义复合表单类型使用约束?

莫里斯

这是一个问题,我已经有一段时间了。请知道我还不是Symfony2专家,所以我可能在某个地方犯了一个菜鸟错误。

text栏位1 :标准Symfony2栏位类型

Field2:compound带有text字段+checkbox字段的自定义字段类型字段

预习

我的目标:将约束添加到autoValue字段中以处理autoValue's text input child

约束不起作用的原因可能是因为NotBlank期望一个字符串值,并且此form字段的内部数据是一个数组array('input'=>'value', 'checkbox' => true)该数组值使用custom转换回字符串DataTransformer但是,我怀疑在针对已知约束验证该字段之后会发生这种情况。

就像您在下面的注释代码中看到的那样,我已经能够在文本输入上获得约束,但是仅当将其硬编码为autoValue的表单类型时,我才想针对主字段的约束进行验证。

我的(简化的)控制器和字段示例代码:

控制器代码

设置用于测试目的的快速表格。

<?php
//...
// $entityInstance holds an entity that has it's own constraints 
// that have been added via annotations

$formBuilder = $this->createFormBuilder( $entityInstance, array(
    'attr' => array(
        // added to disable html5 validation
        'novalidate' => 'novalidate'
    )
));

$formBuilder->add('regular_text', 'text', array(
    'constraints' => array(
        new \Symfony\Component\Validator\Constraints\NotBlank()
    )
));

$formBuilder->add('auto_text', 'textWithAutoValue', array(
    'constraints' => array(
        new \Symfony\Component\Validator\Constraints\NotBlank()
    )
));

TextWithAutoValue源文件

src /我的/组件/表单/类型/TextWithAutoValueType.php

<?php

namespace My\Component\Form\Type;

use My\Component\Form\DataTransformer\TextWithAutoValueTransformer;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;

class TextWithAutoValueType extends AbstractType
{
    /**
     * {@inheritdoc}
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->add('value', 'text', array(
            // when I uncomment this, the NotBlank constraint works. I just
            // want to validate against whatever constraints are added to the
            // main form field 'auto_text' instead of hardcoding them here
            // 'constraints' => array(
            //     new \Symfony\Component\Validator\Constraints\NotBlank()
            // )
        ));

        $builder->add('checkbox', 'checkbox', array(
        ));

        $builder->addModelTransformer(
            new TextWithAutoValueTransformer()
        );
    }

    public function getName()
    {
        return 'textWithAutoValue';
    }
}

src /我/组件/表格/数据转换工具/TextWithAutoValueType.php

<?php

namespace My\Component\Form\DataTransformer;

use Symfony\Component\Form\DataTransformerInterface;

class TextWithAutoValueTransformer 
    implements DataTransformerInterface
{
    /**
     * @inheritdoc
     */
    public function transform($value)
    {
        return array(
            'value'    => (string) $value,
            'checkbox' => true
        );
    }

    /**
     * @inheritdoc
     */
    public function reverseTransform($value)
    {
        return $value['value'];
    }
}

src /我的/ ComponentBundle /资源/config/services.yml

parameters:

services:
    my_component.form.type.textWithAutoValue:
        class: My\Component\Form\Type\TextWithAutoValueType
        tags:
            - { name: form.type, alias: textWithAutoValue }

src / My / ComponentBundle / Resources / views / Form / fields.html.twig

{% block textWithAutoValue_widget %}
    {% spaceless %}

    {{ form_widget(form.value) }}
    {{ form_widget(form.checkbox) }}
    <label for="{{ form.checkbox.vars.id}}">use default value</label>

    {% endspaceless %}
{% endblock %}

我已经阅读文档和Google已有好几个小时了,无法弄清楚如何复制,绑定或引用在构建此表单时添加的原始约束。

->有人知道如何做到这一点吗?

->奖励积分;如何启用已添加到主窗体的绑定实体的约束?(通过对实体类的注释)

聚苯乙烯

抱歉,这成为一个漫长的问题,我希望我已成功阐明了我的问题。如果没有,请询​​问我更多细节!

和风

我建议您再次阅读有关验证文档

我们可以从中得出的结论是,验证主要发生在类而不是表单类型上。那就是你所忽略的。您需要做的是:

  • 为您的TextWithAutoValueType创建数据类,例如,称为src / My / Bundle / Form / Model / TextWithAutoValue它必须包含称为textcheckbox的属性及其设置器/获取器。
  • 将此数据类与您的表单类型相关联。为此,您必须创建一个TextWithAutoValueType :: getDefaultOptions()方法并填充data_class选项。这里获得更多关于这种方法的信息。
  • 为您的数据类创建验证。您可以为此使用注释或Resources / config / validation.yml文件。必须将约束与类的属性相关联,而不是将约束与表单的字段相关联:

validation.yml

src/My/Bundle/Form/Model/TextWithAutoValue:
    properties:
        text:
            - Type:
                type: string
            - NotBlank: ~
        checkbox:
            - Type:
                type: boolean

编辑:

我假设您已经知道如何在另一个表单中使用表单类型。在定义验证配置时,可以使用一个非常有用的东西,称为验证组这是一个基本示例(在validation.yml文件中,因为我对验证批注不太熟练):

src/My/Bundle/Form/Model/TextWithAutoValue:
    properties:
        text:
            - Type:
                type: string
                groups: [ Default, Create, Edit ]
            - NotBlank:
                groups: [ Edit ]
        checkbox:
            - Type:
                type: boolean

有一个groups参数可以添加到每个约束中。它是一个包含验证组名称的数组。当请求对对象进行验证时,可以指定要验证的组。然后,系统将在验证文件中查找应应用哪些约束。

默认情况下,对所有约束都设置“默认”组。这也是执行常规验证时使用的组。

  • 您可以指定一个特定的形式类型的默认组MyFormType :: getDefaultOptions() 通过设置validation_groups参数(字符串数组-验证组的名称),
  • 将表单类型附加到另一个类型时,可以在MyFormType :: buildForm()中使用特定的验证组。

当然,这是所有表单类型选项的标准行为。一个例子:

$formBuilder->add('auto_text', 'textWithAutoValue', array(
    'label' => 'my_label',
    'validation_groups' => array('Default', 'Edit'),
));

至于使用不同的实体,您可以按照与堆积表格相同的体系结构堆积数据类。在上面的示例中,使用textWithAutoValueType的表单类型必须具有一个data_class,该类具有'auto_text'属性和相应的getter / setter。

在验证文件中,有效约束将能够级联验证。具有Valid属性的属性将检测该属性的类,并尝试为该类查找相应的验证配置,并将其应用于相同的验证组:

src/My/Bundle/Form/Model/ContainerDataClass:
    properties:
        auto_text:
            Valid: ~ # Will call the validation conf just below with the same groups

src/My/Bundle/Form/Model/TextWithAutoValue:
    properties:
        ... etc

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

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

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Symfony2:如何对自定义复合表单类型使用约束?

来自分类Dev

自定义Symfony2表单

来自分类Dev

在symfony表单类型中使用自定义约束/验证器

来自分类Dev

在symfony表单类型中使用自定义约束/验证器

来自分类Dev

Symfony2自定义表单字段类型HTML5颜色

来自分类Dev

Symfony2自定义表单类型或扩展名

来自分类Dev

Symfony2自定义字段类型和提交时的表单事件

来自分类Dev

自定义symfony2嵌入表单模板

来自分类Dev

symfony2表单渲染自定义

来自分类Dev

如何在Symfony2 / 3中基于用户角色自定义表单字段?

来自分类Dev

Symfony2自定义验证限制了表单构建器中的使用

来自分类Dev

Symfony + FOSRestBundle - 如何为使用自定义表单类型配置的字段允许 NULL 值?

来自分类Dev

symfony 2创建自定义表单如何获取表单自定义元素?

来自分类Dev

Symfony2自定义按钮

来自分类Dev

Symfony2自定义按钮

来自分类Dev

SF2:如何自定义表单类型消息?

来自分类Dev

Symfony2自定义表单渲染器助手功能

来自分类Dev

Symfony2自定义表单,替换属性,值和主题

来自分类Dev

Symfony2 Doctrine自定义类型生成不必要的迁移

来自分类Dev

可在Symfony2中的自定义字段类型上设置时间戳记

来自分类Dev

Symfony 2.8表单实体类型自定义属性

来自分类Dev

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

来自分类Dev

自定义Symfony2过滤器未使用自定义树枝标签触发

来自分类Dev

Symfony2-为自定义表单类型创建模板

来自分类Dev

Symfony:如何避免自定义表单类型自动包装在div中?

来自分类Dev

Symfony2自定义选民角色层次结构

来自分类Dev

Symfony2自定义控制台命令

来自分类Dev

从自定义目录加载Symfony2翻译

来自分类Dev

symfony2自定义验证器FatalErrorException

Related 相关文章

  1. 1

    Symfony2:如何对自定义复合表单类型使用约束?

  2. 2

    自定义Symfony2表单

  3. 3

    在symfony表单类型中使用自定义约束/验证器

  4. 4

    在symfony表单类型中使用自定义约束/验证器

  5. 5

    Symfony2自定义表单字段类型HTML5颜色

  6. 6

    Symfony2自定义表单类型或扩展名

  7. 7

    Symfony2自定义字段类型和提交时的表单事件

  8. 8

    自定义symfony2嵌入表单模板

  9. 9

    symfony2表单渲染自定义

  10. 10

    如何在Symfony2 / 3中基于用户角色自定义表单字段?

  11. 11

    Symfony2自定义验证限制了表单构建器中的使用

  12. 12

    Symfony + FOSRestBundle - 如何为使用自定义表单类型配置的字段允许 NULL 值?

  13. 13

    symfony 2创建自定义表单如何获取表单自定义元素?

  14. 14

    Symfony2自定义按钮

  15. 15

    Symfony2自定义按钮

  16. 16

    SF2:如何自定义表单类型消息?

  17. 17

    Symfony2自定义表单渲染器助手功能

  18. 18

    Symfony2自定义表单,替换属性,值和主题

  19. 19

    Symfony2 Doctrine自定义类型生成不必要的迁移

  20. 20

    可在Symfony2中的自定义字段类型上设置时间戳记

  21. 21

    Symfony 2.8表单实体类型自定义属性

  22. 22

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

  23. 23

    自定义Symfony2过滤器未使用自定义树枝标签触发

  24. 24

    Symfony2-为自定义表单类型创建模板

  25. 25

    Symfony:如何避免自定义表单类型自动包装在div中?

  26. 26

    Symfony2自定义选民角色层次结构

  27. 27

    Symfony2自定义控制台命令

  28. 28

    从自定义目录加载Symfony2翻译

  29. 29

    symfony2自定义验证器FatalErrorException

热门标签

归档