跳到内容

RepeatedType 字段

编辑此页

这是一个特殊的字段“组”,它创建两个相同的字段,其值必须匹配(否则会抛出验证错误)。最常见的用途是当您需要用户重复其密码或电子邮件以验证准确性时。

渲染为 默认情况下为 input text 字段,但请参阅 type 选项
默认无效消息 值不匹配。
父类型 FormType
RepeatedType

提示

此表单类型定义和继承的完整选项列表可通过在您的应用中运行以下命令获得

1
2
# replace 'FooType' by the class name of your form type
$ php bin/console debug:form FooType

示例用法

1
2
3
4
5
6
7
8
9
10
11
12
use Symfony\Component\Form\Extension\Core\Type\PasswordType;
use Symfony\Component\Form\Extension\Core\Type\RepeatedType;
// ...

$builder->add('password', RepeatedType::class, [
    'type' => PasswordType::class,
    'invalid_message' => 'The password fields must match.',
    'options' => ['attr' => ['class' => 'password-field']],
    'required' => true,
    'first_options'  => ['label' => 'Password'],
    'second_options' => ['label' => 'Repeat Password'],
]);

在成功提交表单后,输入到两个“password”字段中的值将成为 password 键的数据。换句话说,即使实际渲染了两个字段,表单的最终数据也只是您需要的单个值(通常是字符串)。

最重要的选项是 type,它可以是任何字段类型,并确定两个底层字段的实际类型。options 选项传递给每个单独的字段,这意味着 - 在此示例中 - PasswordType 支持的任何选项都可以在此数组中传递。

渲染

重复字段类型实际上是两个底层字段,您可以一次性渲染所有字段,也可以单独渲染。要一次性渲染所有字段,请使用类似如下的代码:

1
{{ form_row(form.password) }}

要单独渲染每个字段,请使用类似如下的代码:

1
2
3
{# .first and .second may vary in your use - see the note below #}
{{ form_row(form.password.first) }}
{{ form_row(form.password.second) }}

注意

名称 firstsecond 是两个子字段的默认名称。但是,这些名称可以通过 first_namesecond_name 选项进行控制。如果您已设置这些选项,则在渲染时使用这些值而不是 firstsecond

验证

repeated 字段的关键功能之一是内部验证(您无需执行任何操作即可进行设置),它强制两个字段具有匹配的值。如果两个字段不匹配,则会向用户显示错误。

invalid_message 用于自定义当两个字段不彼此匹配时将显示的错误。

注意

为了使类型正常工作,mapped 选项对于两个字段始终为 true

字段选项

first_name

类型: string 默认值: first

这是用于第一个字段的实际字段名称。但这在很大程度上是没有意义的,因为输入到两个字段中的实际数据将在分配给 RepeatedType 字段本身的键下可用(例如 password)。但是,如果您未指定标签,则此字段名称用于“猜测”标签。

first_options

类型: array 默认值: []

传递给第一个字段的附加选项(将合并到下面的 options 中)。这对于自定义标签特别有用

1
2
3
4
5
6
7
use Symfony\Component\Form\Extension\Core\Type\RepeatedType;
// ...

$builder->add('password', RepeatedType::class, [
    'first_options'  => ['label' => 'Password'],
    'second_options' => ['label' => 'Repeat Password'],
]);

options

类型: array 默认值: []

此选项数组将传递给两个底层字段中的每一个。换句话说,这些是自定义各个字段类型的选项。例如,如果 type 选项设置为 password,则此数组可能包含选项 always_emptyrequired - 这两个选项都是 PasswordType 字段支持的。

second_name

类型: string 默认值: second

first_name 相同,但用于第二个字段。

second_options

类型: array 默认值: []

传递给第二个字段的附加选项(将合并到上面的 options 中)。这对于自定义标签特别有用(请参阅 first_options)。

type

类型: string 默认值: Symfony\Component\Form\Extension\Core\Type\TextType

两个底层字段将属于此字段类型。例如,传递 PasswordType::class 将渲染两个密码字段。

覆盖的选项

error_bubbling

默认值: false

invalid_message

类型: string 默认值: This value is not valid

如果在此字段中输入的数据没有意义(即,验证失败),则使用此验证错误消息。

例如,如果用户在 TimeType 字段中输入无法转换为实际时间的乱码字符串,或者如果用户在数字字段中输入字符串(例如 apple),则可能会发生这种情况。

正常的(业务逻辑)验证(例如,设置字段的最小长度)应使用带有验证规则的验证消息进行设置(参考)。

继承的选项

这些选项继承自 FormType

attr

类型: array 默认值: []

如果您想向 HTML 字段表示形式添加额外的属性,可以使用 attr 选项。它是一个关联数组,其中 HTML 属性作为键。当您需要为某些小部件设置自定义类时,这可能很有用

1
2
3
$builder->add('body', TextareaType::class, [
    'attr' => ['class' => 'tinymce'],
]);

另请参阅

如果您想将这些属性添加到 表单类型行 元素,请使用 row_attr 选项。

data

类型: mixed 默认值: 默认为底层结构的字段。

当您创建表单时,每个字段最初都会显示表单域数据的相应属性值(例如,如果您将对象绑定到表单)。如果您想覆盖表单或单个字段的此初始值,则可以在 data 选项中设置它

1
2
3
4
5
6
use Symfony\Component\Form\Extension\Core\Type\HiddenType;
// ...

$builder->add('token', HiddenType::class, [
    'data' => 'abcdef',
]);

警告

渲染时,data 选项始终覆盖从域数据(对象)中获取的值。这意味着当表单编辑已持久化的对象时,对象值也会被覆盖,导致其在提交表单时丢失其持久化的值。

error_mapping

类型: array 默认值: []

此选项允许您修改验证错误的目标。

假设您有一个名为 matchingCityAndZipCode() 的自定义方法,该方法验证城市和邮政编码是否匹配。不幸的是,您的表单中没有 matchingCityAndZipCode 字段,因此 Symfony 所能做的只是在表单顶部显示错误。

通过自定义错误映射,您可以做得更好:将错误映射到城市字段,以便错误显示在其上方

1
2
3
4
5
6
7
8
public function configureOptions(OptionsResolver $resolver): void
{
    $resolver->setDefaults([
        'error_mapping' => [
            'matchingCityAndZipCode' => 'city',
        ],
    ]);
}

以下是映射的左侧和右侧的规则

  • 左侧包含属性路径;
  • 如果违规是在类的属性或方法上生成的,则其路径为 propertyName
  • 如果违规是在 arrayArrayAccess 对象的条目上生成的,则属性路径为 [indexName]
  • 您可以通过连接嵌套属性路径来构造嵌套属性路径,用点分隔属性。例如:addresses[work].matchingCityAndZipCode
  • 右侧包含表单中字段的名称。

默认情况下,任何未映射属性的错误都将冒泡到父表单。您可以使用点(.)在左侧将所有未映射属性的错误映射到特定字段。例如,要将所有这些错误映射到 city 字段,请使用

1
2
3
4
5
$resolver->setDefaults([
    'error_mapping' => [
        '.' => 'city',
    ],
]);

help

类型: stringTranslatableInterface 默认值: null

允许您为表单字段定义帮助消息,默认情况下该消息在字段下方呈现

1
2
3
4
5
6
7
8
9
10
11
12
13
use Symfony\Component\Translation\TranslatableMessage;

$builder
    ->add('zipCode', null, [
        'help' => 'The ZIP/Postal code for your credit card\'s billing address.',
    ])

    // ...

    ->add('status', null, [
        'help' => new TranslatableMessage('order.status', ['%order_id%' => $order->getId()], 'store'),
    ])
;

help_attr

类型: array 默认值: []

设置用于显示表单字段帮助消息的元素的 HTML 属性。其值是一个关联数组,其中 HTML 属性名称作为键。这些属性也可以在模板中设置

1
2
3
{{ form_help(form.name, 'Your name', {
    'help_attr': {'class': 'CUSTOM_LABEL_CLASS'}
}) }}

help_html

类型: boolean 默认值: false

默认情况下,help 选项的内容在模板中呈现之前会被转义。将此选项设置为 true 以不转义它们,这在帮助包含 HTML 元素时很有用。

invalid_message_parameters

类型: array 默认值: []

设置 invalid_message 选项时,您可能需要在字符串中包含一些变量。这可以通过向该选项添加占位符并将变量包含在此选项中来完成

1
2
3
4
5
$builder->add('someField', SomeFormType::class, [
    // ...
    'invalid_message' => 'You entered an invalid value, it should include %num% letters',
    'invalid_message_parameters' => ['%num%' => 6],
]);

mapped

类型: boolean 默认值: true

如果您希望在读取或写入对象时忽略该字段,则可以将 mapped 选项设置为 false

row_attr

类型: array 默认值: []

添加到用于渲染 表单类型行 的元素的 HTML 属性的关联数组

1
2
3
$builder->add('body', TextareaType::class, [
    'row_attr' => ['class' => 'text-editor', 'id' => '...'],
]);

另请参阅

如果您想将这些属性添加到 表单类型小部件 元素,请使用 attr 选项。

本作品,包括代码示例,根据 Creative Commons BY-SA 3.0 许可获得许可。
目录
    版本