CollectionType领域

编辑本页

TextType填充数组的字段电子邮件值。在更复杂的例子中,您可以嵌入整个表单,这在创建公开一对多关系的表单时非常有用(例如,您可以从一个产品中管理许多相关的产品照片)。

呈现为 取决于entry_type选项
默认无效消息 集合无效。
遗留无效消息 值{{value}}无效。
父类型 FormType
CollectionType

提示

这个表单类型定义和继承的完整选项列表可以在你的应用程序中运行这个命令:

1 2
将'FooType'替换为你的表单类型的类名php bin/console debug:form FooType . php

电子邮件字段,该字段对应于电子邮件地址数组。在表单中,您希望将每个电子邮件地址作为其自己的输入文本框公开:

12 3 4 5 6 7 8 9 10 11 12
使用ob娱乐下载组件形式扩展核心类型CollectionType使用ob娱乐下载组件形式扩展核心类型EmailType/ /……构建器->add (“电子邮件”, CollectionType::类,//数组中的每个条目都是一个"email"字段“entry_type”= > EmailType::类,//这些选项被传递给每个"email"类型“entry_options”= > [“attr”= > [“类”= >“邮箱”],],]);

最简单的渲染方法是一次性渲染:

1
{{form_row(form.email)}}

一个更灵活的方法是这样的:

1 2 3 4 5 6 7 8 9 10 11
{{form_label(form.email)}}{{form_errors(form.email)}}<ul>{%form中的emailField。电子邮件%}<>{{form_errors(emailField)}}{{form_widget(emailField)}}>{%endfor%}ul>

在这两种情况下,除非您的电子邮件数据数组已经包含一些电子邮件。

在这个简单的示例中,仍然无法添加新地址或删除现有地址。方法可以添加新地址allow_add选项(以及可选的原型选项)(参见下面的示例)。从电子邮件数组是可行的allow_delete选择。

allow_add设置为真正的,然后如果提交了任何无法识别的项目,它们将被无缝添加到项目数组中。这在理论上是很好的,但在实践中要使客户端JavaScript正确需要付出更多的努力。

在前面的示例中,假设从电子邮件数据数组。在这种情况下,将呈现两个输入字段,看起来像这样(取决于你的表单名称):

1 2
<输入类型“电子邮件”id“form_emails_0”的名字“形式(电子邮件)[0]”价值“foo@foo.com”/><输入类型“电子邮件”id“form_emails_1”的名字“形式(电子邮件)[1]”价值“bar@bar.com”/>

要允许您的用户添加另一个电子邮件,只需设置allow_add真正的并且-通过JavaScript -呈现另一个字段的名称形式(电子邮件)[2](以此类推,会有越来越多的字段)。

为帮助简化此操作,请设置原型选项真正的允许你呈现一个“模板”字段,然后你可以在你的JavaScript中使用它来帮助你动态地创建这些新字段。渲染的原型字段看起来像这样:

1 2 3 4 5
<输入类型“电子邮件”id“form_emails___name__”的名字“形式(电子邮件)(__name__)”价值""/>

通过替换__name__有一些独特的值(例如:2),您可以在表单中构建并插入新的HTML字段。

使用jQuery,一个简单的示例可能如下所示。如果你一次性渲染你的集合字段(例如。form_row (form.emails)),那么事情就更容易了,因为data-prototype属性会自动为你呈现(略有不同-见下面的注释),你所需要的是以下JavaScript代码:

12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
/ / add-collection-widget.jsjQuery (文档时(函数{jQuery (“.add-another-collection-widget”) .click (函数evarlist = jQuery(jQuery() .attr (“data-list-selector”));//尝试找到列表的计数器或使用列表的长度varCounter = list.data(“widget-counter”) || list.children().length;//获取原型模板varnewWidget = list.attr(“data-prototype”);//替换原型id和名称中的"__name__//电子邮件中唯一的数字//结束名称属性看起来像name="contact[email][2]"newWidget = newWidget.replace(/ __name__ / g、计数器);//增加计数器计数器+ +;//并存储它,如果允许删除小部件,则不能使用长度list.data (“widget-counter”、计数器);//创建一个新的列表元素并将其添加到列表中varjQuery(list.attr(“data-widget-tags”) . html (newWidget);newElem.appendTo(列表);});});

并按如下方式更新模板:

12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
{{form_start(form)}}{#……#}{#在data-prototype属性上存储原型<ulid“email-fields-list”data-prototype{{form_widget(form.email .vars.prototype)|e}}data-widget-tags{{'
  • '|e}}
    data-widget-counter{{form.emails |长度}}>{%form中的emailField。电子邮件%}<>{{form_errors(emailField)}}{{form_widget(emailField)}}>{%endfor%}ul><按钮类型“按钮”“add-another-collection-widget”data-list-selector“# email-fields-list”>添加另一封邮件按钮>{#……#}{{form_end(form)}}<脚本src“add-collection-widget.js”>脚本>

    提示

    如果您要一次呈现整个集合,则原型将自动在data-prototype元素的属性(例如:div表格)围绕着你的收藏。唯一的区别是整个“表单行”都是为您呈现的,这意味着您不必像上面所做的那样将其包装在任何容器元素中。

    布尔默认的

    如果设置为真正的,则如果未识别的项提交到集合,则它们将作为新项添加。结束数组将包含现有项以及提交数据中的新项。有关详细信息,请参阅上面的示例。

    原型选项可以用来帮助呈现一个原型项,可以使用JavaScript在客户端动态创建新的表单项。有关更多信息,请参阅上面的示例和如何嵌入一个集合的形式

    谨慎

    如果您正在嵌入整个其他表单以反映一对多的数据库关系,则可能需要手动确保这些新对象的外键设置正确。如果你使用Doctrine,这不会自动发生。更多细节请参见上面的链接。

    布尔默认的

    如果设置为真正的,则如果提交的数据中不包含现有项,则该项将正确地从最终项数组中缺席。这意味着您可以通过JavaScript实现一个“delete”按钮,从DOM中删除表单元素。当用户提交表单时,表单在提交的数据中缺失意味着它将从最终数组中删除。

    有关更多信息,请参见如何嵌入一个集合的形式

    谨慎

    在嵌入对象集合时使用此选项时要小心。在这种情况下,如果删除任何嵌入的表单,则它们将正确地从最终对象数组中缺失。但是,根据您的应用程序逻辑,当删除其中一个对象时,您可能希望删除它,或者至少删除它对主对象的外键引用。这些都不是自动处理的。有关更多信息,请参见如何嵌入一个集合的形式

    布尔或可调用的默认的

    如果要显式地从表单中删除完全为空的集合项,则必须将此选项设置为真正的.属性时,才会删除现有集合项allow_delete选择启用。否则将保留空值。

    谨慎

    delete_empty选项仅在规范化值为时删除项.如果嵌套entry_type是复合表单类型,必须设置要求选项或设置empty_data选项.这两个选项都可以在内部设置entry_options.阅读有关表单的empty_data选项来了解为什么这是必要的。

    只有规范化值为时,才会从集合中删除值.但是,您也可以将选项值设置为一个可调用对象,它将对提交的集合中的每个值执行。如果可调用对象返回真正的时,该值将从集合中移除。例如:

    1 2 3 4 5 6 7 8 9
    使用ob娱乐下载组件形式扩展核心类型CollectionType/ /……构建器->add (“用户”, CollectionType::类,/ /……“delete_empty”= >函数(用户用户= null)返回===用户||用户->getFirstName ());}));

    在复合表单类型中使用可调用对象特别有用,因为复合表单类型可以定义复杂的条件,将其视为空的。

    数组默认的[]

    类中指定的表单类型所传递的数组entry_type选择。例如,如果您使用ChoiceType作为你的entry_type选项(例如,对于下拉菜单的集合),那么您至少需要传递选择底层类型的选项:

    12 3 4 5 6 7 8 9 10 11 12 13 14 15
    使用ob娱乐下载组件形式扩展核心类型ChoiceType使用ob娱乐下载组件形式扩展核心类型CollectionType/ /……构建器->add (“favoriteCities”, CollectionType::类,“entry_type”= > ChoiceType::类,“entry_options”= > [“选择”= > [纳什维尔的= >纳什维尔的“巴黎”= >“巴黎”“柏林”= >“柏林”“伦敦”= >“伦敦”,],],]);

    布尔默认的真正的

    属性时,此选项非常有用allow_add选择。如果真正的(如果allow_add真正的),一个特殊的“prototype”属性将是可用的,这样你就可以在你的页面上呈现一个新元素应该是什么样子的“模板”示例。的的名字属性为__name__.这允许你通过JavaScript添加一个“添加另一个”按钮,读取原型,替换__name__使用一些唯一的名称或数字,并在表单中呈现它。提交时,它将被添加到您的底层数组中,因为allow_add选择。

    方法来呈现原型字段原型集合字段中的变量:

    1
    {{form_row(form.email .vars.prototype)}}

    注意,你真正需要的是“小部件”,但取决于你如何呈现你的表单,拥有整个“表单行”对你来说可能更容易。

    提示

    属性上的原型表单行自动可用data-prototype元素的属性(例如:div表格)围绕着你的收藏。

    有关如何实际使用此选项的详细信息,请参见上面的示例以及如何嵌入一个集合的形式

    混合默认的

    允许您为原型定义特定的数据。添加的每一行最初都将包含此选项设置的数据集。缺省情况下,为所有条目配置的数据带有entry_options选项将被使用:

    1 2 3 4 5 6 7 8 9 10
    使用ob娱乐下载组件形式扩展核心类型CollectionType使用ob娱乐下载组件形式扩展核心类型TextType/ /……构建器->add (“标签”, CollectionType::类,“entry_type”= > TextType::类,“allow_add”= >真正的“原型”= >真正的“prototype_data”= >“新的标签占位符”]);

    invalid_message

    类型字符串默认的此值无效

    这是验证错误消息,如果输入到该字段的数据没有意义(即验证失败),将使用该消息。

    例如,如果用户将无意义的字符串输入到TimeType字段不能转换为实时的,或者如果用户输入字符串(例如。苹果)转换为数字字段。

    正常(业务逻辑)验证(例如在设置字段的最小长度时)应该使用验证消息和验证规则(参考).

    FormType.并不是所有的选项都列在这里-只有最适用于这种类型:

    attr

    类型数组默认的[]

    属性,可以向HTML字段表示形式添加额外属性attr选择。它是一个以HTML属性为键的关联数组。当你需要为某个小部件设置自定义类时,这可能很有用:

    1 2 3
    构建器->add (“身体”, TextareaType::类,“attr”= > [“类”= >“tinymce”)));

    另请参阅

    使用row_attr属性中添加这些属性表单类型行元素。

    by_reference

    类型布尔默认的真正的

    在大多数情况下,如果你有作者场,然后你期望setAuthor ()在底层对象上调用。然而,在某些情况下,setAuthor ()五月被称为。设置by_reference确保在所有情况下都调用setter。

    为了进一步解释这一点,这里有一个简单的例子:

    12 3 4 5 6 7 8 9 10 11 12 13
    使用ob娱乐下载组件形式扩展核心类型EmailType使用ob娱乐下载组件形式扩展核心类型FormType使用ob娱乐下载组件形式扩展核心类型TextType/ /……构建器->createFormBuilder (文章);构建器->add (“标题”, TextType::类)->add (构建器->创建(“作者”, FormType::类,“by_reference”= > ?)->add (“名字”, TextType::类)->add (“电子邮件”, EmailType::类))

    如果by_reference是真的吗,下面的事情发生在你打电话时的幕后提交()(或handleRequest ())在表格上:

    1 2 3
    文章->setTitle (“……”);文章->getAuthor ()->setName (“……”);文章->getAuthor ()->setEmail (“……”);

    请注意,setAuthor ()没有调用。作者因引用而有所修改。

    如果你设置by_reference对于false,提交看起来像这样:

    1 2 3 4 5
    文章->setTitle (“……”);作者克隆文章->getAuthor ();作者->setName (“……”);作者->setEmail (“……”);文章->setAuthor (作者);

    所有这些by_reference = false真正做的是它克隆对象,这强制框架在父对象上调用setter。

    类似地,如果你使用CollectionType字段,其中您的底层收集数据是一个对象(就像Doctrine的ArrayCollection),然后by_reference必须设置为如果你需要加法器和移除器(例如。addAuthor ()而且removeAuthor ())被称为。

    empty_data

    类型混合

    默认值为[](空数组)。

    这个选项决定字段的值返回当提交的值为空(或缺失)时。如果在视图中呈现表单时没有提供初始值,则不设置初始值。

    这意味着它可以帮助您处理带有空白字段的表单提交。例如,如果你想要的名字要显式设置为的字段John Doe当没有选择值时,你可以这样做:

    1 2 3 4
    构建器->add (“名字”, (“要求”= >“empty_data”= >“John Doe”]);

    这仍然会呈现一个空文本框,但在提交John Doe值将被设置。使用数据占位符选项,在呈现的表单中显示此初始值。

    如果表单是复合的,则可以设置empty_data作为数组、对象或闭包。看到如何为窗体类配置空数据文章中有关于这些选项的详细信息。

    请注意

    如果你想设置empty_data整个表单类的选项,请参见如何为窗体类配置空数据篇文章。

    谨慎

    表格数据转换器还会适用于吗empty_data价值。这意味着将转换为空字符串.如果显式地希望返回空字符串,则使用自定义数据转换器。

    error_mapping

    类型数组默认的[]

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

    假设您有一个名为matchingCityAndZipCode ()这将验证城市和邮政编码是否匹配。不幸的是,没有matchingCityAndZipCode字段,所以Symfony所能做的就是在表单的顶部显示错误。ob娱乐下载

    使用自定义错误映射,你可以做得更好:将错误映射到城市字段,这样它就会显示在它上面:

    1 2 3 4 5 6 7 8
    公共函数configureOptions(OptionsResolver解析器解析器->setDefaults ([“error_mapping”= > [“matchingCityAndZipCode”= >“城市”,],]);}

    下面是映射左侧和右侧的规则:

    • 左侧包含属性路径;<李>如果在类的属性或方法上生成违规,则其路径为propertyName<李>类的项上生成的违例数组ArrayAccess对象时,属性路径为(indexName)<李>您可以通过连接它们来构造嵌套的属性路径,用圆点分隔属性。例如:地址[工作].matchingCityAndZipCode<李>右侧包含表单中字段的名称。

    默认情况下,任何未映射的属性的错误都会冒泡到父表单。你可以用点(),将所有未映射属性的错误映射到特定字段。例如,将所有这些错误映射到城市字段中,使用:

    1 2 3 4 5
    解析器->setDefaults ([“error_mapping”= > [“。”= >“城市”,],]);

    标签

    类型字符串TranslatableMessage默认的:从字段名“猜测”标签

    设置呈现字段时将使用的标签。设置为将压制标签:

    1 2 3 4 5 6 7 8
    使用ob娱乐下载组件翻译TranslatableMessage构建器->add (“zipCode”, (“标签”= >“邮政编码”//你可以选择使用TranslatableMessage对象作为标签内容“标签”= >TranslatableMessage (“address.zipCode”, (%的国家%的= >国家),“地址”),)

    标签也可以在模板中设置:

    • 嫩枝
    • PHP
    1
    {{form_label(form.name, '你的名字')}}

    label_attr

    类型数组默认的[]

    属性的HTML属性<标识>元素,它将在呈现字段的标签时使用。它是一个以HTML属性为键的关联数组。这些属性也可以直接在模板中设置:

    • 嫩枝
    • PHP
    1 2 3
    {{form_label(form.name, '您的名字',{' label_attr': {'class': 'CUSTOM_LABEL_CLASS'}})}}

    label_format

    类型字符串默认的

    配置用作字段标签的字符串,以防标签选项未设置。这在使用时很有用关键字翻译信息

    如果您使用关键字翻译消息作为标签,您通常会对同一个标签有多个关键字消息(例如。profile_address_streetinvoice_address_street).这是因为标签是为字段的每个“路径”构建的。为了避免重复的关键字消息,您可以将标签格式配置为静态值,例如:

    1 2 3 4 5 6 7 8
    / /……profileFormBuilder->add (“地址”, AddressType::类,“label_format”= >“form.address. %名称%”]);invoiceFormBuilder->add (“发票”, AddressType::类,“label_format”= >“form.address. %名称%”]);

    此选项由子类型继承。的标签字段都将使用form.address.street关键字信息。

    label格式有两个变量:

    % id %
    字段的唯一标识符,由字段的完整路径和字段名组成。profile_address_street);
    %的名字%
    字段名(例如:).

    默认值()的结果是“人性化”版本字段名的。

    请注意

    label_format选项在表单主题中求值。确保更新你的模板以防你定制表单主题

    映射

    类型布尔默认的真正的

    如果希望在读取或写入对象时忽略该字段,则可以设置映射选项

    要求

    类型布尔默认的真正的

    如果为,则HTML5所需属性将被渲染。相应的标签还会渲染一个要求类。

    这是肤浅的,与验证无关。如果您让Symfony猜测您的字段类型,ob娱乐下载那么这个选项的值将从您的验证信息中猜测出来。

    请注意

    必选选项还影响如何处理每个字段的空数据。有关详细信息,请参见empty_data选择。

    数组默认的[]

    元素中添加的HTML属性的关联数组,用于呈现表单类型行

    1 2 3
    构建器->add (“身体”, TextareaType::类,“row_attr”= > [“类”= >“文本编辑器”“id”= >“……”)));

    另请参阅

    使用attr属性中添加这些属性表单类型小部件元素。